如何在Oracle SQL Developer中运行存储过程?

45

我正在尝试运行这个存储过程

DECLARE
  P_TICKER_SERIAL VARCHAR2(200);
  P_SECTOR_CODE   VARCHAR2(200);
  P_SOURCE_ID     VARCHAR2(200);
  P_COUNTRY_CODE  VARCHAR2(200);
  P_FILTER_TYPE   NUMBER;
  CUR_OUT         SYS_REFCURSOR;
  dbUserTable     DBUSER%ROWTYPE;
BEGIN
  P_TICKER_SERIAL :='14232';
  P_SECTOR_CODE   := '15';
  P_SOURCE_ID     := 'TDWL';
  P_COUNTRY_CODE  := 'SA';
  P_FILTER_TYPE   := 1;

  PKG_name.GET_user(
    P_TICKER_SERIAL => P_TICKER_SERIAL,
    P_SECTOR_CODE   => P_SECTOR_CODE,
    P_SOURCE_ID     => P_SOURCE_ID,
    P_COUNTRY_CODE  => P_COUNTRY_CODE,
    P_FILTER_TYPE   => P_FILTER_TYPE,
    CUR_OUT         => CUR_OUT
  );
  open CUR_OUT;
  LOOP
    FETCH CUR_OUT INTO dbUserTable;
    dbms_output.put_line(dbUserTable.email);
  END LOOP;
  CLOSE CUR_OUT;
END;
 /

但是它给我这个错误

Error report:
ORA-06550: line 8, column 15:
PLS-00201: identifier 'DBUSER' must be declared
ORA-06550: line 8, column 15:
PL/SQL: Item ignored
ORA-06550: line 24, column 2:
PLS-00382: expression is of wrong type
ORA-06550: line 24, column 2:
PL/SQL: SQL Statement ignored
ORA-06550: line 26, column 24:
PLS-00320: the declaration of the type of this expression is incomplete or malformed
ORA-06550: line 26, column 5:
PL/SQL: SQL Statement ignored
ORA-06550: line 27, column 28:
PLS-00320: the declaration of the type of this expression is incomplete or malformed
ORA-06550: line 27, column 7:
PL/SQL: Statement ignored
06550. 00000 -  "line %s, column %s:\n%s"
*Cause:    Usually a PL/SQL compilation error.
*Action:

有人知道是什么问题吗? 谢谢。


CUR_OUT 表示多行而不是单个值。 - Samy Louize Hanna
  1. GET_user过程很可能打开了游标,所以无需再次打开它(因为PLS-00382错误)- 删除open CUR_OUT语句;2) 如果不想让会话永远挂起,你需要一个退出循环条件exit when CUR_OUT%notfound。
- Nick Krasnov
4个回答

68

尝试按以下方式执行该过程:

var c refcursor;
execute pkg_name.get_user('14232', '15', 'TDWL', 'SA', 1, :c);
print c;

1
谢谢您的快速回复,但它给了我这个错误:绑定变量“c”未声明。匿名块已完成。 - Samy Louize Hanna
1
在执行该过程之前,您需要运行 var c refcursor。该机制用于给变量分配值。 - Dba
1
在第3行命令启动时出错: execute pkg_name.get_user('14232', '15', 'TDWL', 'SA', 1, :c) 错误报告: ORA-00904: "TDWL": 无效标识符 ORA-06512: 在"schema.PKG_name"的第156行 ORA-06512: 在第1行 00904. 00000 - "%s: 无效标识符" *原因:
*操作: 第156行与我的存储过程无关。
- Samy Louize Hanna
1
@Samy Louize Hanna,错误信息看起来像是你的过程代码出了问题。 - Dba
第156行代码没有引用我的存储过程。 - Samy Louize Hanna
显示剩余4条评论

10

假设你已经创建了以下的一个过程。

CREATE OR REPLACE PROCEDURE GET_FULL_NAME like
(
  FIRST_NAME IN VARCHAR2, 
  LAST_NAME IN VARCHAR2,
  FULL_NAME OUT VARCHAR2 
) IS 
BEGIN
  FULL_NAME:= FIRST_NAME || ' ' || LAST_NAME;
END GET_FULL_NAME;
在Oracle SQL Developer中,您可以以两种方式运行此过程。 1. 使用SQL工作区
创建一个SQL工作区并编写像这样的PL/SQL匿名块,然后按f5键。
DECLARE
  FULL_NAME Varchar2(50);
BEGIN
  GET_FULL_NAME('Foo', 'Bar', FULL_NAME);
  Dbms_Output.Put_Line('Full name is: ' || FULL_NAME);
END;

2. 使用GUI控件

  • 展开Procedures

  • 右键单击您创建的过程,然后单击Run

  • 在弹出窗口中,填写参数并单击OK

干杯!


抱歉,但第一点出现问题:“标识符FULL_NAME必须声明”。 - BohBah
如果我没记错的话,我相信你可能想要写“...你可以分两步运行这个过程”(即“步骤”,而不是“方式”)。 - Woodchuck

0
  • 执行 PROCEDURE_NAME
  • 执行 PRECEDURE_NAME(参数)

请考虑进行编辑,以更明显地展示您在 https://dev59.com/52Ij5IYBdhLWcg3whFQH#20186667 之外提供的额外见解;最好根据 [答案] 进行编辑。 - Yunnosch

-4

-- 如果不需要向过程传递任何参数,只需:

BEGIN
   MY_PACKAGE_NAME.MY_PROCEDURE_NAME
END;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接