无法从 SQL*Plus 创建和执行 PL/SQL 过程

Posted

技术标签:

【中文标题】无法从 SQL*Plus 创建和执行 PL/SQL 过程【英文标题】:Failing to create and execute PL/SQL procedure from SQL*Plus 【发布时间】:2013-05-23 05:29:51 【问题描述】:
create or replace package XXX_MWA_LOV_TEST AS
    TYPE t_ref_csr IS REF CURSOR;
    PROCEDURE XXX_USERS_LOV (p_user_name IN VARCHAR2,x_users OUT NOCOPY t_ref_csr);
end XXX_MWA_LOV_TEST;

如何在 SQL*Plus 中运行XXX_USERS_LOV 过程?

我尝试了这段代码,但出现语法错误:

SQL> EXECUTE XXX_MWA_LOV_TEST.XXX_USERS_LOV('%',:my_p_out);

程序主体:

create or replace package body XXX_MWA_LOV_TEST AS
  PROCEDURE XXX_USERS_LOV (x_users OUT NOCOPY t_ref_csr,p_user_name IN VARCHAR2) IS
  BEGIN
    OPEN x_users FOR select user_id,user_name,description 
      from fnd_user
      where user_name like p_user_name;
    DBMS_OUTPUT.PUT_LINE('TESTING DATA');
    EXCEPTION
      WHEN OTHERS THEN
        DBMS_OUTPUT.PUT_LINE('ERROR IN USER LOV '|| SQLERRM);
  END XXX_USERS_LOV;

end XXX_MWA_LOV_TEST;

【问题讨论】:

你定义了过程体吗? 我已经更新了程序主体.. 请告诉我如何执行包含参考光标作为参数的程序.. 我是新手... 【参考方案1】:

首先,参数在spec和包体中的顺序必须一致。

你可以这样调用引用光标:

 declare 
   v_cursor xxx_mwa_lov_test.t_ref_csr;
   var1 the_type_you_need;
   var2 the_type_you_need;
   ...
 begin
   xxx_mwa_lov_test.xxx_users_lov(v_cursor,'username...');

   loop
      fetch v_cursor into var1, var2...;
      exit when v_cursor%notfound;
      ... do what you want with the vars...
   end loop;
end;
/

【讨论】:

以上是关于无法从 SQL*Plus 创建和执行 PL/SQL 过程的主要内容,如果未能解决你的问题,请参考以下文章

PL/SQL数据库开发那点事

PL/SQL编程_存储程序

获取 SQL 执行计划。 PL/SQL Developer = 奇怪的行为。 SQL*Plus = 未选择任何行

从文件执行 PL/SQL 函数

SQL Plus和PL/SQL

SQL Plus 无法识别 Oracle PL/SQL 语句