我是Oracle新手,今天写了个存储过程,开始是仿照书上写的:SQL> REM Subprogram Procedure
SQL> create or replace procedure mymenuMSG(msgno base.dinner_menu.MENU_ID%TYPE,m
2 sgname OUT base.dinner_menu.MENU_NAME%TYPE,msgcategory OUT base.dinner_menu.MENU
3 _CATEGORY) AS
4 begin
5 select MENU_NAME,MENU_CATEGORY into msgname,msgcategory
6 from base.dinner_menu
7 where MENU_ID=msgno;
8 end;
9 /警告: 创建的过程带有编译错误。SQL> variable mname varchar2(15)
SQL> variable mcate varchar2(15)
SQL> execute mymenuMSG(2,:mname,:mcate);
BEGIN mymenuMSG(2,:mname,:mcate); END; *
ERROR 位于第 1 行:
ORA-06550: 第 1 行, 第 7 列:
PLS-00905: 对象 SYS.MYMENUMSG 无效
ORA-06550: 第 1 行, 第 7 列:
PL/SQL: Statement ignored我之前新建了个base方案,里面有张dinner_menu表。
我试图定义msgno的类型为表dinner_menu中base.dinner_menu.MENU_ID字段的类型,但是出现了上面的编译错误,并且不能执行。在网上随便搜了下,也没找到答案。我就把胡乱参数改成了具体的类型,可以正确编译和执行。
SQL> REM Subprogram Procedure
SQL> create or replace procedure mymenuMSG(msgno number,msgname out varchar2,msgcategory ou
2) AS
2 begin
3 select MENU_NAME,MENU_CATEGORY into msgname,msgcategory
4 from base.dinner_menu
5 where MENU_ID=msgno;
6 end;
7 /过程已创建。SQL> variable mname varchar(16)
用法: VAR[IABLE] [ <variable> [ NUMBER | CHAR | CHAR (n [CHAR|BYTE]) |
VARCHAR2 (n [CHAR|BYTE]) | NCHAR | NCHAR (n) |
NVARCHAR2 (n) | CLOB | NCLOB | REFCURSOR ] ]
SQL> variable mname varchar2(16)
SQL> variable mcategory varchar2(16)
SQL> exec mymenuMSG(2,:mname,:mcategory);PL/SQL 过程已成功完成。SQL> print mname mcategory;MNAME
--------------------------------
红烧牛排
MCATEGORY
--------------------------------
2我想知道这是为什么啊?参数设置时候难道不能设置成从数据库表中设置的类型吗?但是为什么书上那样设置又没有问题呢?难道是我的代码写的有问题?希望高手能帮我看看!
SQL> create or replace procedure mymenuMSG(msgno base.dinner_menu.MENU_ID%TYPE,m
2 sgname OUT base.dinner_menu.MENU_NAME%TYPE,msgcategory OUT base.dinner_menu.MENU
3 _CATEGORY) AS
4 begin
5 select MENU_NAME,MENU_CATEGORY into msgname,msgcategory
6 from base.dinner_menu
7 where MENU_ID=msgno;
8 end;
9 /警告: 创建的过程带有编译错误。SQL> variable mname varchar2(15)
SQL> variable mcate varchar2(15)
SQL> execute mymenuMSG(2,:mname,:mcate);
BEGIN mymenuMSG(2,:mname,:mcate); END; *
ERROR 位于第 1 行:
ORA-06550: 第 1 行, 第 7 列:
PLS-00905: 对象 SYS.MYMENUMSG 无效
ORA-06550: 第 1 行, 第 7 列:
PL/SQL: Statement ignored我之前新建了个base方案,里面有张dinner_menu表。
我试图定义msgno的类型为表dinner_menu中base.dinner_menu.MENU_ID字段的类型,但是出现了上面的编译错误,并且不能执行。在网上随便搜了下,也没找到答案。我就把胡乱参数改成了具体的类型,可以正确编译和执行。
SQL> REM Subprogram Procedure
SQL> create or replace procedure mymenuMSG(msgno number,msgname out varchar2,msgcategory ou
2) AS
2 begin
3 select MENU_NAME,MENU_CATEGORY into msgname,msgcategory
4 from base.dinner_menu
5 where MENU_ID=msgno;
6 end;
7 /过程已创建。SQL> variable mname varchar(16)
用法: VAR[IABLE] [ <variable> [ NUMBER | CHAR | CHAR (n [CHAR|BYTE]) |
VARCHAR2 (n [CHAR|BYTE]) | NCHAR | NCHAR (n) |
NVARCHAR2 (n) | CLOB | NCLOB | REFCURSOR ] ]
SQL> variable mname varchar2(16)
SQL> variable mcategory varchar2(16)
SQL> exec mymenuMSG(2,:mname,:mcategory);PL/SQL 过程已成功完成。SQL> print mname mcategory;MNAME
--------------------------------
红烧牛排
MCATEGORY
--------------------------------
2我想知道这是为什么啊?参数设置时候难道不能设置成从数据库表中设置的类型吗?但是为什么书上那样设置又没有问题呢?难道是我的代码写的有问题?希望高手能帮我看看!
1.msgname 这个参数为什么分成2行?
定义参数的时候可以使用schema.table_name.column_name%type来定义的,你这个过程的问题出在第二个参数msgname被你从m之后开始断开分成2行了
那你在下一行定义msgname参数,不要这样断开,肯定是有问题的
我有用过show error,但是不晓得事什么编译错哇!
SQL> show error
PROCEDURE MYMENUMSG 出现错误:LINE/COL ERROR
-------- -----------------------------------------------------------------
2/8 PLS-00103: 出现符号 "OUT"在需要下列之一时:
:= . ) , @ % default
character
符号 "," 被替换为 "OUT" 后继续。3/1 PLS-00103: 出现符号 "_"在需要下列之一时:
:= . ) , @ % default
character
符号 ":=在 "_" 继续之前已插入。
这是之前出现的错误提示。现在问题解决了!
SQL> REM Subprogram Procedure
SQL> create or replace procedure mymenuMSG(msgno base.dinner_menu.MENU_ID%TYPE
2 msgname OUT base.dinner_menu.MENU_NAME%TYPE,msgcategory OUT
3 base.dinner_menu.MENU_CATEGORY%TYPE) AS
4 begin
5 select MENU_NAME,MENU_CATEGORY into msgname,msgcategory
6 from base.dinner_menu
7 where MENU_ID=msgno;
8 end;
9 /过程已创建。SQL> variable mname varchar2(16)
SQL> variable mcategory varchar2(16)
SQL> exec mymenuMSG(2,:mname,:mcategory);PL/SQL 过程已成功完成。SQL> print mname mcategoryMNAME
--------------------------------
红烧牛排
MCATEGORY
--------------------------------
2SQL>
谢谢你啦!以后有什么问题请教你呀!高手!呵呵
sqlplus里面可不像word会自动将一个完整的单词放到下一行。
在sqlplus里面是不能将单词断成2行来写的,要不然识别不了