الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

أتمنى أن أنجح في إنشاء إجراء مخزن واحد !

مغلق
بدأه أبو محمد اللحياني في 28 أكتوبر 2007 · 10 رد · 1,708 مشاهدة · في قواعد بيانات MySQL
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

وهذه الصيغة هل هي صحيحة متوافقة مع دليل الاستخدام ولكن تظهر أخطاء في phpMyadmin

CREATE FUNCTION  getfieldvalue (
	tbl char(30),
	fieldname char(30), 
	keyid char(30), 
	valueid INT(10)
	)  
	RETURNS CHAR(180)
BEGIN
	Declare myneed CHAR(180) default '';
	SELECT fieldname into myneed FROM tbl WHERE (keyid=valeid);
	RETURN myneed;
END;

لا أدري ما ذا أفعل

تم تعديل هذه المشاركة بواسطة أبو محمد اللحياني في 28 أكتوبر 2007 في 03:57

ولو وافيت ربك دون ذنب *** وناقشك الحساب إذاً هلكتا

ولم يظلمك في عملٍ ولكن *** عسير أن تقوم بما حملتا

#2

لو لاحظت أن معظم شركات الإستضافة ( الشركات الكبرى ) لا تدعم MySQL 5 حتى الأن لأن عملية تحديث برنامج تتطلب تحديث برامج أخرى و هنا توجد مشكلة أن phpMyAdmin لا يدعم MySQL 5 حتى الأن ولذلك يمكنك إنشاء functions بواسطة أدوات MySQL مثل MySQL Administrator أو MySQL Query Browser أو يمكنك إنشائها من خلال Terminal إذا كنت تستعمل Linux أو من خلال CMD إذا كنت تستعمل Windows

و هذة الخطوات هى ما يجب إتباعها لإنشاء Function التى تريدها

CONSOLE

mysql> DELIMITER //

mysql> CREATE FUNCTION getfieldvalue (

-> tbl char(30),

-> fieldname char(30),

-> keyid char(30),

-> valueid INT(10)

-> )

-> RETURNS CHAR(180)

-> BEGIN

-> Declare myneed CHAR(180) default '';

-> SELECT fieldname into myneed FROM tbl WHERE (keyid=valeid);

-> RETURN myneed;

-> END//

mysql> DELIMITER;

تم تعديل هذه المشاركة بواسطة asm-soft في 28 أكتوبر 2007 في 21:36

forum-signature-01.gif
#3

جزاك الله خيراً

لقد نجحت في إنشاء نفس الإجراء بالصيغة التي رفضها phpMyadmin وذلك باستخدام دوال php .

ثم اختبرت ذلك بـأمر

show create function getfieldvalue;

لتظهر لي هذه النتيجة :

Array
(
	[0] => Array
		(
			[Function] => getfieldvalue
			[sql_mode] => 
			[Create Function] => CREATE DEFINER=`root`@`localhost` FUNCTION `getfieldvalue`(
	tbl char(30),
	fieldname char(30), 
	keyid char(30), 
	valueid INT(10)
	) RETURNS char(180) CHARSET cp1256
BEGIN
	Declare myneed CHAR(180) default '';
	SELECT fieldname into myneed FROM tbl WHERE (keyid=valeid);
	RETURN myneed;
END
		)

)

والأمر الثاني :

show function status;

لتظهر النتيجة الثانية :

Array
(
	[0] => Array
		(
			[Db] => main
			[Name] => getfieldvalue
			[Type] => FUNCTION
			[Definer] => root@localhost
			[Modified] => 2007-02-17 19:37:33
			[Created] => 2007-02-17 19:37:33
			[Security_type] => DEFINER
			[Comment] => 
		)

	[1] => Array
		(
			[Db] => main
			[Name] => hello
			[Type] => FUNCTION
			[Definer] => root@localhost
			[Modified] => 2007-03-30 07:41:06
			[Created] => 2007-03-30 07:41:06
			[Security_type] => DEFINER
			[Comment] => 
		)

)

تم تعديل هذه المشاركة بواسطة أبو محمد اللحياني في 29 أكتوبر 2007 في 07:56

ولو وافيت ربك دون ذنب *** وناقشك الحساب إذاً هلكتا

ولم يظلمك في عملٍ ولكن *** عسير أن تقوم بما حملتا

#4

ما فعلته فيما سبق يدل على أن الأمر موجود في قاعدة الييانات ولكن لما اختبره الأمر :

call getfieldvalue('users', 'username', 'userid', '1');

وظهر الخطأ التالي :

1305 : PROCEDURE main.getfieldvalue does not exist.

ولا أدري ما هو الحل ؟؟؟؟؟؟؟

ولو وافيت ربك دون ذنب *** وناقشك الحساب إذاً هلكتا

ولم يظلمك في عملٍ ولكن *** عسير أن تقوم بما حملتا

#5

ثم جربت عبارة select بدلاً عن call لأنه داله تعطي نتيجة وليس إجراء.

select getfieldvalue('users', 'username', 'userid', 1);

وظهر لي الخطأ التالي:

1146 : Table 'main.tbl' doesn't exist

أي أنه لم يتعرف على البرامتر tbl على أنه متغير.

أيضاً لا أدري ما هو الحل .

لعلنا نستفيد من الأخطاء .

تم تعديل هذه المشاركة بواسطة أبو محمد اللحياني في 29 أكتوبر 2007 في 08:07

ولو وافيت ربك دون ذنب *** وناقشك الحساب إذاً هلكتا

ولم يظلمك في عملٍ ولكن *** عسير أن تقوم بما حملتا

#6

أسف على التأخير فقد كنت مشغول اليومين السابقين

يجب إستخدام المتغيرات فى النظام الروتينى .................. :blink:

أنا حاسس إنها مشمفهومة................ صح

أنا قصدى إن المتغيرات فى Functions و Procedures يجب إستخدامها فى تبديل القيم وليس تبديل أسماء جداول أو حقول

هل وضحت الصورة ؟؟؟؟؟

تم تعديل هذه المشاركة بواسطة asm-soft في 30 أكتوبر 2007 في 08:50

forum-signature-01.gif
#7
اقتباس
أنا حاسس إنها مشمفهومة................ صح

نعم

اقتباس
هل وضحت الصورة ؟؟؟؟؟

لا

أنا استخدمتها كما ورد في دليل الاستخدام وكمتغير أي لغة .

لي طلب لو تشرح لي ما تقصده وتجعل الكود الذي سألت عنه كمثال

بارك الله فيك وبارك في وقتك .. آمين

ولو وافيت ربك دون ذنب *** وناقشك الحساب إذاً هلكتا

ولم يظلمك في عملٍ ولكن *** عسير أن تقوم بما حملتا

#8
اقتباس
أنا استخدمتها كما ورد في دليل الاستخدام وكمتغير أي لغة .

هذا منافى لما أعرفة لذلك هل توضح لى أين أجد هذا المثال ( أو الكود الذى ذكرتة ) فى دليل الإستخدام حتى أعرف أين المشكلة بالتحديد و كمان نبقى فى الصورة مع بعض

ربما يكون تم إضافات جديدة لم أعرفها بعد

forum-signature-01.gif
#9

عفواً أخي الكريم لا أقصد أني أعرف ما لا تعرف ولا زلت مبتدئاً في mysql وفي البرمجة عموماً

ولكني وجدت عدة أمثلة ثم حاولت محاكاتها ولا أعرف التفاصيل

وهذه بعض الأمثلة:

################################
CREATE PROCEDURE sp1 (x VARCHAR(5))
  BEGIN
	DECLARE xname VARCHAR(5) DEFAULT 'bob';
	DECLARE newname VARCHAR(5);
	DECLARE xid INT;
	SELECT xname,id INTO newname,xid 
	  FROM table1 WHERE xname = xname;
	SELECT newname;
  END;
########################
CREATE PROCEDURE dorepeat(p1 INT)
 BEGIN
   SET @x = 0;
  REPEAT SET @x = @x + 1; UNTIL @x > p1 END REPEAT;
 END;
CALL dorepeat(1000);
SELECT @x;
##################################
CREATE PROCEDURE simpleproc (OUT param1 INT)
	BEGIN
	  SELECT COUNT(*) INTO param1 FROM t;
	END;
CALL simpleproc(@a);
SELECT @a;
##################################
CREATE FUNCTION hello (s CHAR(20)) RETURNS CHAR(50)
 RETURN CONCAT('Hello, ',s,'!');
SELECT hello('world');
##################################

وأنا لا أعرف متى أستخدم بالبادئة "@" في أسماء المتغيرات .

ونحن في php نستخدم '$' بدلاً منها

أنا أريد استخدام الدالة (getfieldvalue) التي هي في أول مشاركة لي بتمرير قيم المتغيرات.

عذراً على الإطالة.

ولو وافيت ربك دون ذنب *** وناقشك الحساب إذاً هلكتا

ولم يظلمك في عملٍ ولكن *** عسير أن تقوم بما حملتا

#10
اقتباس
عفواً أخي الكريم لا أقصد أني أعرف ما لا تعرف ولا زلت مبتدئاً في mysql وفي البرمجة عموماً

عفواً أخى الكريم أنا لا أقصد أننى أعرف ما لا يعرفة أحد فكل ما أقصدة أنه ربما يكون تم إضافة بعض الإضافات الجديدة التى لم أعرفها بعد و هذة الإضافات فى الكتاب الذى تملكة فأنا أعمل على MySQL 5.1.26 فى برامجى و MySQL4 فى مواقع الإنترنت و ربما أن تكون هذة الإضافات فى MySQL 6 و أنت تستخدم كتاب لـ MySQL 6 وتعمل على MySQL 5 وهذا يسبب هذة المشاكل

فكل ما أعرفة أن يتم إستخدام المتغيرات فى Functions و Procedures فى الوضع أو النظام الروتينى و معنى هذا الأتى :

يمكن إستخدام المتغيرات فى تبديل القيم التى تلحق بالحقول ونأخذ مثال على ذلك

CONSOLE
mysql>set @x = 5;

mysql>select * from t1 where t1_id = @x;

ولا يتم إستخدام المتغيرات فى تبديل أسماء الحقول أو الجداول فالمثال الأتى مثال خطأ

CONSOLE
mysql>set @x = 5;

mysql>set @f = 't1_id';

mysql>select * from t1 where @f = @x;

وبذلك جميع الأمثلة التى وضعتها فى المشاركة السابقة كلها صحيحة ماعدا المثال الأول وذلك حسب معرفتى والله أعلم

و لمزيد من المعرفة شاهد هذة الصفحة

http://dev.mysql.com/doc/refman/5.1/en/sel...-statement.html

تم تعديل هذه المشاركة بواسطة asm-soft في 31 أكتوبر 2007 في 10:23

forum-signature-01.gif
#11

جزاك الله خيراً

أخيراً لقد نجحت

CREATE FUNCTION  getCategory (
	flag char(30),
	id INT(10)
	)  
	RETURNS CHAR(180)
BEGIN
	Declare myneed CHAR(180) default NULL;

	CASE flag
		WHEN 'cats'   THEN select `catname`   into myneed from `cats`   WHERE (`catid`=id);
		WHEN 'topics' THEN select `topicname` into myneed from `topics` WHERE (`topicid`=id);
		WHEN 'albums' THEN select `subject`   into myneed from `albums` WHERE (`albumid`=id);
	END CASE;

	RETURN myneed;
END;

ثم استخدمنا :

select getCategory('topics', 7) AS Category;

لتظهر النتيجة كالتالي :

[Category] => my test topicname

وإن كانت هذه الدالة قليلة الجدوى إلا أنها بداية طيبة بالنسبة لي والحمد لله أولاً وآخراً .

أكرر شكري لك أخي asm-soft وبارك الله فيك .

تم تعديل هذه المشاركة بواسطة أبو محمد اللحياني في 31 أكتوبر 2007 في 14:32

ولو وافيت ربك دون ذنب *** وناقشك الحساب إذاً هلكتا

ولم يظلمك في عملٍ ولكن *** عسير أن تقوم بما حملتا

هذا الموضوع مغلق.

مواضيع مشابهة