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

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语句中的字符串.因此,它无法断言查询投影中的列与数字和数据类型匹配ref游标的签名.因此,它无法验证ref游标变量和查询之间的契约.当我们考虑可以从USER_TAB_COLUMNS上的查询汇编动态SQL语句时,更容易理解为什么不允许这样做.

oracle不使用游标,oracle – 为什么我们不能在动态SQL语句中使用强引用游标?相关推荐

  1. oracle怎么优化动态sql语句,oracle动态sql语句处理

    动态SQL语句处理:根据要处理的sql语句的作用不同,可以使用三种不同类型的动态sql方法:使用execute immediate语句可以处理包括ddl(create.alter和drop).DCL( ...

  2. Oracle 动态SQL语句

    Oracle 动态SQL语句     EXECUTE IMMEDIATE代替了以前Oracle8i中DBMS_SQLpackage包.  它解析并马上执行动态的SQL语句或非运行时创建的PL/SQL块 ...

  3. Oracle 动态游标 PL/SQL 动态SQL语句 open for [using] 语句

    PL/SQL:open for [using] 语句 2017年07月19日 09:52:55 学孩儿无牙哭做粥 阅读数:681 标签: oracleSQLPLSQL 更多 个人分类: ORACLES ...

  4. 使用Oracle的DBMS_SQL包执行动态SQL语句

    引用自:http://blog.csdn.net/ggjjzhzz/archive/2005/10/17/507880.aspx 在某些场合下,存储过程或触发器里的SQL语句需要动态生成.Oracle ...

  5. oracle表名使用变量名,oracle 中动态sql语句,表名为变量,怎么解?

    如果你用的是 Oracle 8i 及以上的版本,那简单,在过程中用 execute immediate sql_str 就行, sql_str 是一个拼凑的 SQL 语句,但这个动态语句中带参数,或 ...

  6. oracle 执行带参数的sql语句_Oracle动态SQL语句的简单执行

    在使用ODP.NET进行Oracle编程时,有时候SQL语句非常复杂,需要采用动态构造查询语句的情况,有两种方法可以构造动态的SQL语句,并执行返回结果集. 1.在数据访问层构造SQL语句 例如下面的 ...

  7. Oracle PL/SQL进阶编程(第十五弹:动态SQL语句)

    理解动态SQL语句 动态SQL语句基础 动态SQL语句不仅是指SQL语句是动态拼接而成的,更主要的是SQL语句所使用的对象也是运行时期才创建的.出现这种功能跟PL/SQL本身的早起绑定特性有关,早PL ...

  8. oracle修改表结构的sql命令是什么,sql语句中修改表结构的命令是什么?

    sql语句中修改表结构的命令是:"ALTER TABLE"命令. ALTER TABLE 语句用于在已有的表中添加.删除或修改列. SQL ALTER TABLE 语法 如需在表中 ...

  9. oracle 哦【的【,清晰讲解SQL语句中的外连接,通用于Mysql和Oracle,全是干货哦

    清晰讲解SQL语句中的外连接,通用于Mysql和Oracle,全是干货哦 直入主题: 我们做一个操作,将员工SCOTT的部门去掉,再次通过内连接查看数据,看看会产生什么现象? 使用内连接,查询数据 问 ...

最新文章

  1. Python3通过汉字输出拼音
  2. 事件监听器 java_Java实现一个简单的事件监听器
  3. Visual Studio 2005 SQL Server 2005 are COMING!
  4. Java高级技术笔记
  5. struts——struts在升级,作为程序员,该怎样以不变应万变?
  6. .php on line 0,启动禅道项目管理软件时,报PHP Warning: PHP Startup: in Unknown on line 0解决方法...
  7. 机械制造工艺基础_机械制造工艺基础知识,錾削与锯削加工工艺
  8. PTA—比较大小(C语言)
  9. golang 捕获堆栈信息_一篇文章教你如何捕获前端错误
  10. HDOJ-2602 Bone Collector [DP-01背包问题]
  11. Linux常用工具包安装
  12. 0基础学习3dmax游戏建模有这4个技巧
  13. Python3 爬虫教程 - 新兴网页解析利器 parsel
  14. 基于大数据的一线城市住房租赁影响因素分析
  15. Maven第5篇:手把手教你搭建私服
  16. hdu 4747 Pet
  17. loj6198谢特 后缀数组+并查集+Trie
  18. vue中获取并操作dom元素
  19. linux php-fpm配置,php-fpm配置
  20. MAC M1安装Node

热门文章

  1. WWW 2021有哪些值得读的图机器学习相关论文?
  2. LTP 4.0!单模型完成6项自然语言处理任务
  3. 让Keras更酷一些:中间变量、权重滑动和安全生成器
  4. PyTorch项目使用TensorboardX进行训练可视化
  5. 数字图像处理与Python实现笔记之空间滤波
  6. gulp+babel实现es6压缩,并替换es6语法,压缩html,css
  7. LeetCode 897 递增顺序搜索树
  8. Spring Boot——Spring Security环境下跨域addCorsMappings与拦截器冲突导致跨域失效解决方案
  9. BugKuCTF WEB 点击一百万次
  10. Nearest Common Ancestors