如何在过程调用期间内联记录类型变量?

时间:2019-07-09 22:03:34

标签: oracle stored-procedures plsql parameter-passing

我正在尝试直接将SELECT语句作为存储过程参数传递,但无法。如果我添加一个局部变量,然后Select INTO,它将很好地工作。

这里是一个例子:

DECLARE
    something MyTable%ROWTYPE;
    PROCEDURE Test(param IN MyTable%ROWTYPE) as
    BEGIN
        ...
    END;
BEGIN
    SELECT 
      SYS_GUID() as ID,
      'X' as COLUMN1,
      'Y' as COLUMN2,
      'Z' as COLUMN3
      INTO something
      FROM DUAL
      WHERE rownum < 2;

    Test(something);
END;

这按预期工作正常,但是如果我尝试内联something变量,它将失败:

DECLARE
    PROCEDURE Test(param IN MyTable%ROWTYPE) as
    BEGIN
        ...
    END;
BEGIN
    Test((SELECT 
      SYS_GUID() as ID,
      'X' as COLUMN1,
      'Y' as COLUMN2,
      'Z' as COLUMN3
      FROM DUAL
      WHERE rownum < 2));
END;
  

ORA-06550:第11行,第11列:   PLS-00103:遇到以下情况之一时遇到符号“ SELECT”:

     

(-+ case mod new不为null             继续平均计数当前存在最大最小先前sql stddev      总和方差执行所有合并时间时间戳记间隔      日期        管                  

      
  • &-+; /在mod余数rem和   或具有相减负顺序的组开始并集,其中   连接||多集
  •   

为什么它不接受我的内联选择语句,但是在将结果存储到变量中时起作用?我该怎么做才能使内联语句按预期工作?

1 个答案:

答案 0 :(得分:2)

Oracle无法directly use SQL statements in PL/SQL expressions。 (尽管在Postgres和其他数据库系统中都是可能的。)

如果要传递SQL语句,使用SYS_REFCURSOR可能会更容易,例如:

CREATE TABLE mytable(id varchar2(32), x varchar2(1), y varchar2(1), z varchar2(1));

DECLARE
    v_cursor SYS_REFCURSOR;

    something MyTable%ROWTYPE;
    PROCEDURE Test(p_cursor sys_refcursor) as
    BEGIN
        FETCH p_cursor INTO something;
        dbms_output.put_line(something.id);
    END;
BEGIN
    OPEN v_cursor for
    SELECT 
        SYS_GUID() as ID,
        'X' as COLUMN1,
        'Y' as COLUMN2,
        'Z' as COLUMN3
        INTO something
        FROM DUAL;

    Test(v_cursor);
END;
/