ورود

View Full Version : سوال: این کد درست هستش یا غلط



capitan_nemesis
شنبه 11 بهمن 1393, 13:39 عصر
دارم تمرین mysql میکنم
این کد نمیدم درست نوشتم یا غلط
create procedure اررور میده

create table register
(
register_id int primary key auto_increment ,
register_name varchar(50) ,
register_family varchar(50) ,
register_age int ,
register_password int ,
register_email varchar(500)
);

insert into register(register_name , register_family , register_age , register_password , register_email)
values ('ali' , 'choobdar' , 27 , 123456, 'aligalaxy666@gmail.com')

create procedure usp_register()
(
@register_name varchar(50) ,
@register_family varchar(50) ,
@register_age int ,
@register_password int ,
@register_email varchar(500)
)
as
begin
insert into usp_register(register_name , register_family , register_age , register_password , register_email)
values(@register_name , @register_family , @register_age , @register_password , @register_email)
end;

capitan_nemesis
شنبه 11 بهمن 1393, 20:28 عصر
:گریه::گریه:

ashkufaraz
شنبه 11 بهمن 1393, 21:53 عصر
حالا چرا گریه می کنی درستش اینه

DELIMITER $$
DROP PROCEDURE IF EXISTS `usp_register` $$
CREATE DEFINER=`root`@`%` PROCEDURE usp_register()
(
in register_name varchar(50) ,
in register_family varchar(50) ,
in register_age int ,
in register_password int ,
in register_email varchar(500)
)
begin
insert into usp_register(register_name , register_family , register_age , register_password , register_email)
values(@register_name , @register_family , @register_age , @register_password , @register_email)
end $$;
DELIMITER ;

mojtabamalaekeh
شنبه 11 بهمن 1393, 21:57 عصر
سلام
اشکالایی که من دیدم اینان:
جلوی اسم پروسیجر یه بار پرانتز باز و بسته گذاشتین انگار که هیچ پارامتری نداره!
یه بار دیگه هم پرانتز باز کردین پارامترها رو تعریف کردین و پرانتز رو بستین.
قبل از اسم پارامترها @ گذاشتین که برای متغیرهای سراسری بکار میره نه پارامترهای محلی پروسیجر. @ ها رو حذف کنید
کلمه as نمیدونم برا چی گذاشتین؟
بعد از insert into بجای اسم جدول، اسم خود پروسیجر رو گذاشتین.

دستور insert آخرش سمی کالن نداره:

یا آخرش سمی کالن بذارید و چون پروسیجر شما یک دستور بیشتر نداره میتونید begin, end رو حذف کنید.
یا اگه نمیخواید begin, end رو حذف کنید باید:



کاراکتر جدا کننده ای غیر از سمی کالن تعریف کنید
داخل پروسیجر، آخر هر دستور سمی کالن بذارید
بعد از end انتهای پروسیجر، بجای سمی کالن از کاراکتر جداکننده جدیدی که تعریف کردین استفاده کنید
دوباره کاراکتر جداکننده رو به سمی کالن برگردونید.


DROP PROCEDURE IF EXISTS usp_register;
delimiter //
create procedure usp_register
(
in register_name varchar(50) ,
in register_family varchar(50) ,
in register_age int ,
in register_password int ,
in register_email varchar(500)
)
begin
insert into usp_register(register_name , register_family , register_age , register_password , register_email)
values(register_name , register_family , register_age , register_password , register_email);
end//
delimiter ;

دستور DROP که خط اول نوشته شده برا اینه که اگه پروسیجر موجود بود پاکش کنه تا موقع create با خطای already exists مواجه نشین.

mojtabamalaekeh
شنبه 11 بهمن 1393, 22:15 عصر
ashkufaraz (http://barnamenevis.org/member.php?160138-ashkufaraz) جان میشه توضیح بدین جریان delimiter چیه؟
من آخر دستور DROP سمی کالن میذارم و مرورگر این پیغام رو برا گرفتن تأیید میده:

Do you really want to :

DROP PROCEDURE IF EXISTS usp_register;
delimiter //
create procedure usp_register()
(
in regis
...
(همیشه فکر میکردم این پیغام طبیعیه چونیه چیزی میخواد DROP بشه :دی)

بعد از DROP هم delimiter تعریف کردم. اما شما همون خط اول Delimiter رو عوض کردی و این پیغام هم نمیاد موقع اجرا.

آخر دستور insert هم سمی کالن نذاشتی ولی بعد از end هم $$ گذاشتی هم ; چجوریه؟
قبل از اسم پارامترها هم @ گذاشتین. برا چیه؟


نحوه فراخوانی و پارامتردهی به پروسیجر هم اگه بگین ممنون میشم. برا من خطا میده:

call usp_register("a", "b", 1, 2, "c");

#1305 - PROCEDURE test.usp_register does not exist

capitan_nemesis
یک شنبه 12 بهمن 1393, 08:58 صبح
منم جریان رو درست نگرفتم

این کد داستانش چیه
DROP PROCEDURE IF EXISTS usp_register;

این چیه
delimiter

اینم درست نگرفتم چرا این $$ و هم ;

in جریانش چیه
مگه متغیر رو با @ نشون نمیدن ؟؟؟

capitan_nemesis
یک شنبه 12 بهمن 1393, 09:18 صبح
دوستان
این بازم اررور
http://8pic.ir/images/9n8vrpq2kd0nkosozz3p_thumb.png (http://8pic.ir/viewer.php?file=9n8vrpq2kd0nkosozz3p.png)

mojtabamalaekeh
یک شنبه 12 بهمن 1393, 10:40 صبح
آخر دستور insert که خط 11 و 12 نوشتی ; بذار
توی خط 25 و 26 هم یه دستور insert داری که اونم آخرش ; میخواد و به دلیلی که تو پست قبلیم گفتم قبل از شروع پروسیجر باید کاراکتر جداکننده رو با دستور delimiter x تغییر بدی که بجای x عبارت دلخواهت رو میذاری تا بتونی بین begin , end از ; در آخر دستورات استفاده کنی وگرنه فکر میکنم اولین سمی کالنی که مشاهده بشه به معنای پایان پروسیجر باشه!
اینی که نارنجی کردم رو مطمئن نیستم ولی اگه درست باشه دلیل استفاده از کلمه ی کلیدی delimiter مشخص میشه.

شما فعلا همین کارایی که توی پست شماره 3 گفتم رو انجام بده چون بعضی اشکالات رو توی عکس دوباره تکرار کردی.
مثلا نوشتی insert into usp_register در حالی که باید اسم جدولت رو بنویسی. یعنی insert into register

پارامترهای in وردی هستند یعنی یه مقدار مشخصی پاس میدی به پروسیجر
پارامترهای out خروجی هستند یعنی یه متغیر که حتی مقدار اولیه اش میتونه نامشخص باشه پاس میدی به پروسیجر و بعد از اجرای پروسیجر، مقدار جدید توی متغیر قرار میگیره
پارامترهای inout هم ورودی ان هم خروجی. یعنی یه متغیر با مقدار اولیه ی مشخص پاس میدی به پروسیجر که بعد از اجرای پروسیجر اگر مقداردهی شده باشه، مقدار جدیدش توی متغیری که پاس دادی قرار میگیره.
مثل پارامترهای کپی و مرجع تو زبان های برنامه نویسی (اگه سی شارپ کار کردی مثل ref, out میشه)
علامت @ هم برای متغیرهای سراسریه که در طول کد MySql تعریف می کنی برا نگهداری مقادیر.
پس پارامترهای پروسیجر رو با @ معرفی نمی کنیم.

capitan_nemesis
یک شنبه 12 بهمن 1393, 12:16 عصر
بچه های کرج
جایی هست که mysql رو کامل درس بدن
یا
cd آموزشی خیلی خوب

با این که sql server دارم میخونم
ولی
مشکل اساسی با نرم افزار های ماکروسافت دارم

بعضی از این کد ها رو این کار نمیکنه چکار کنم کامل mysql یاد بگیرم
انگلیسی زیاد خوب نیست