Oracle 如何在过程调用期间内联recordtype变量?

Oracle 如何在过程调用期间内联recordtype变量?,oracle,stored-procedures,plsql,parameter-passing,Oracle,Stored Procedures,Plsql,Parameter Passing,我试图将SELECT语句直接作为存储过程参数传递,但无法。如果我添加一个局部变量,并在其中选择,它就可以正常工作 以下是一个例子: DECLARE something MyTable%ROWTYPE; PROCEDURE Test(param IN MyTable%ROWTYPE) as BEGIN ... END; BEGIN SELECT SYS_GUID() as ID, 'X' as COLUMN1,

我试图将
SELECT
语句直接作为存储过程参数传递,但无法。如果我添加一个局部变量,并在其中选择
,它就可以正常工作

以下是一个例子:

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;
ORA-06550:第11行第11列: PLS-00103:在预期以下情况时遇到符号“选择”:

(+case mod new不为空) 继续平均计数当前存在最大最小优先sql STDEV 对所有合并时间时间戳间隔执行求和方差 日期 管
  • &-+;/at表示mod余数rem和 或具有相交减顺序起始并集的组,其中 连接| |多集
为什么它不接受我的内联select语句,但在将结果存储到变量中时可以工作?我需要做什么才能让内联语句按我的意愿工作?

Oracle不能。(尽管在Postgres和其他数据库系统中可能会这样做。)

如果要传递SQL语句,使用
SYS\u 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;
/
Oracle不能。(尽管在Postgres和其他可能的数据库系统中也可以。)

如果要传递SQL语句,使用
SYS\u 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;
/

我假设你不再需要用这种方法在
SELECT
语句中使用
到某个东西中去。@julealgon这是正确的。虽然最终你需要用cursor变量将
到某个东西中去。我假设你不再需要用这个应用程序在
SELECT
语句中使用
到某个东西中去roach.@julealgon这是正确的。尽管最终您需要使用cursor变量将
转换为