我正在尝试直接将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和 或具有相减负顺序的组开始并集,其中 连接||多集
为什么它不接受我的内联选择语句,但是在将结果存储到变量中时起作用?我该怎么做才能使内联语句按预期工作?
答案 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;
/