gpt4 book ai didi

oracle - 为什么我们不能在动态 SQL 语句中使用强引用游标?

转载 作者:行者123 更新时间:2023-12-01 15:01:49 26 4
gpt4 key购买 nike

我正在尝试使用带有动态 sql 语句的强 ref cur,但它给出了一个错误,但是当我使用弱游标时它可以工作,请解释原因是什么,请
向我转发 oracle 服务器架构师的任何链接,其中包含有关如何在 Oracle 服务器中完成编译和解析的问题。这是错误和代码。

ERROR at line 6:
ORA-06550: line 6, column 7:
PLS-00455: cursor 'EMP_REF_CUR' cannot be used in dynamic SQL OPEN statement
ORA-06550: line 6, column 2:
PL/SQL: Statement ignored

declare
type ref_cur_type IS REF CURSOR RETURN employees%ROWTYPE; --Creating a strong REF cursor,employees is a table
emp_ref_cur ref_cur_type;
emp_rec employees%ROWTYPE;
BEGIN
OPEN emp_ref_cur FOR 'SELECT * FROM employees';
LOOP
FETCH emp_ref_cur INTO emp_rec;
EXIT WHEN emp_ref_cur%NOTFOUND;
END lOOP;
END;

最佳答案

这是一个带有强类型引用游标的过程:

SQL> create or replace procedure p1 is
2 type dept_rc is ref cursor return dept%rowtype;
3 my_ref_cursor dept_rc;
4 begin
5 open my_ref_cursor for
6 select * from dept;
7 end;
8 /

Procedure created.

SQL>

下一条语句失败,因为 EMP 记录的签名与 DEPT 表的签名不匹配。
SQL> create or replace procedure p1 is
2 type dept_rc is ref cursor return dept%rowtype;
3 my_ref_cursor dept_rc;
4 begin
5 open my_ref_cursor for
6 select * from emp;
7 end;
8 /

Warning: Procedure created with compilation errors.

SQL> show error
Errors for PROCEDURE P1:

LINE/COL ERROR
-------- -----------------------------------------------------------------
5/5 PL/SQL: SQL Statement ignored
6/9 PLS-00382: expression is of wrong type

SQL>

但是,如果我们更改投影以匹配 DEPT 表,那么我们又成功了:
SQL> create or replace procedure p1 is
2 type dept_rc is ref cursor return dept%rowtype;
3 my_ref_cursor dept_rc;
4 begin
5 open my_ref_cursor for
6 select deptno, ename, job from emp;
7 end;
8 /

Procedure created.

SQL>

那么,为什么我们不能在动态 SQL 中使用强类型引用游标呢?
SQL> create or replace procedure p1 is
2 type dept_rc is ref cursor return dept%rowtype;
3 my_ref_cursor dept_rc;
4 begin
5 open my_ref_cursor for
6 'select * from dept';
7 end;
8 /

Warning: Procedure created with compilation errors.

SQL> show error
Errors for PROCEDURE P1:

LINE/COL ERROR
-------- -----------------------------------------------------------------
5/5 PL/SQL: Statement ignored
5/10 PLS-00455: cursor 'MY_REF_CURSOR' cannot be used in dynamic SQL
OPEN statement

SQL>

因为编译器无法解析动态 SQL 语句中的字符串。因此它不能断言查询投影中的列在数量和数据类型上与引用游标的签名相匹配。因此,它无法验证引用游标变量和查询之间的契约。当我们考虑到可以从 USER_TAB_COLUMNS 上的查询组装动态 SQL 语句时,更容易理解为什么不允许这样做。

关于oracle - 为什么我们不能在动态 SQL 语句中使用强引用游标?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2783461/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com