我是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我想知道这是为什么啊?参数设置时候难道不能设置成从数据库表中设置的类型吗?但是为什么书上那样设置又没有问题呢?难道是我的代码写的有问题?希望高手能帮我看看!

解决方案 »

  1.   


    1.msgname 这个参数为什么分成2行?
      

  2.   

    在SQLPLUS下,自动跳转的!应该是当行写不下吧!
      

  3.   


    定义参数的时候可以使用schema.table_name.column_name%type来定义的,你这个过程的问题出在第二个参数msgname被你从m之后开始断开分成2行了
      

  4.   


    那你在下一行定义msgname参数,不要这样断开,肯定是有问题的
      

  5.   

    象你这个存储过程编译出错的时候,你可以通过输入show error来查看错在哪里
      

  6.   

    谢谢你啊!是你说的那错误,为什么他SQLPLUS自动跳转的也会出现问题啊!搞不懂!
    我有用过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> 
    谢谢你啦!以后有什么问题请教你呀!高手!呵呵
      

  7.   


    sqlplus里面可不像word会自动将一个完整的单词放到下一行。
    在sqlplus里面是不能将单词断成2行来写的,要不然识别不了