为什么我不能在动态 SQL 的 DDL/SCL 语句中使用绑定变量?

2023-11-23

我正在尝试使用绑定变量在动态 SQL 中执行 SQL 命令:

-- this procedure is a part of PL/SQL package Test_Pkg
PROCEDURE Set_Nls_Calendar(calendar_ IN VARCHAR2)
IS
BEGIN
   EXECUTE IMMEDIATE
      'ALTER SESSION
      SET NLS_CALENDAR = :cal'
      USING IN calendar_;
END Set_Nls_Calendar;

然后在客户端,我尝试调用该过程:

Test_Pkg.Set_Nls_Calendar('Thai Buddha');

但这就是我ORA-02248: invalid option for ALTER SESSION.

我的问题是:为什么我不能在动态 SQL 的 DDL/SCL 语句中使用绑定变量?


DDL 语句中不允许绑定变量。所以下面的语句会导致错误:

  • 示例#1:DDL 语句。会引发ORA-01027: 数据定义操作不允许绑定变量

    EXECUTE IMMEDIATE
      'CREATE TABLE dummy_table ( dummy_column NUMBER DEFAULT :def_val )'
      USING 42;
    
  • 示例#2:DDL 语句。会引发ORA-00904:: 无效标识符

    EXECUTE IMMEDIATE
      'CREATE TABLE dummy_table ( :col_name NUMBER )'
      USING var_col_name;
    
  • 示例#3:SCL 语句。会引发ORA-02248: ALTER SESSION 的选项无效

    EXECUTE IMMEDIATE
      'ALTER SESSION SET NLS_CALENDAR = :cal'
      USING var_calendar_option;
    

Problem

要理解为什么会发生这种情况,我们需要看看动态SQL语句是如何处理的.

Typically, an application program prompts the user for the text of a SQL statement and the values of host variables used in the statement. Then Oracle parses the SQL statement. That is, Oracle examines the SQL statement to make sure it follows syntax rules and refers to valid database objects. Parsing also involves checking database access rights1, reserving needed resources, and finding the optimal access path.

1 Emphasis added by answerer

请注意,解析步骤发生before将任何变量绑定到动态语句。如果您检查上面的四个示例,您将意识到解析器在不知道绑定变量的值的情况下无法保证这些动态 SQL 语句的语法有效性。

  • 例子#1:解析器无法判断绑定值是否有效。如果不是USING 42,程序员写道USING 'forty-two'?
  • 例子#2: 解析器无法判断是否:col_name将是一个有效的列名称。如果绑定的列名是'identifier_that_well_exceeds_thirty_character_identifier_limit'?
  • 例子#3:值NLS_CALENDAR是内置常量(对于给定的 Oracle 版本?)。解析器无法判断绑定变量是否具有有效值。

所以答案是您不能在动态 SQL 中绑定表名、列名等架构元素。您也不能绑定内置常量.


Solution

实现动态引用模式元素/常量的唯一方法是在动态 SQL 语句中使用字符串连接。

  • 示例#1:

    EXECUTE IMMEDIATE
      'CREATE TABLE dummy_table ( dummy_column NUMBER DEFAULT ' || to_char(42) || ')';
    
  • 示例#2:

    EXECUTE IMMEDIATE
      'CREATE TABLE dummy_table (' || var_col_name || ' NUMBER )';
    
  • 示例#3:

    EXECUTE IMMEDIATE
      'ALTER SESSION SET NLS_CALENDAR = ''' || var_calendar_option || '''';
    
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么我不能在动态 SQL 的 DDL/SCL 语句中使用绑定变量? 的相关文章

  • JDBC元数据检索约束信息

    我需要来自约束名称的有关表和列名称的信息 是否存在类似于connection getMetadata getX的人来检索约束信息 我的测试用例在Oracle数据库中 但我最好的解决方案只是想用jdbc来解决 如果您正在谈论外键和主键约束 这
  • 每组最大 n 个 SQL 查询的高性能方法

    我正在尝试构建一个基础设施 以便根据需要快速运行回归 从包含我们网络服务器上所有历史活动的数据库中提取 apache 请求 为了通过确保我们仍然回归来自较小客户的请求来提高覆盖范围 我想通过为每个客户检索最多 n 个 为了这个问题 假设 1
  • ORACLE SQL 中的 MAX()

    我有一个表 存储已完成的维护任务的记录列表以及完成的日期和时间 我正在尝试执行子查询来提取具有最新日期的每个任务的记录 我的SQL语句是 SELECT ENGINEERING COMPLIANCE EO AS EO ENGINEERING
  • postgresql 中的咨询锁超时

    我正在从 ORACLE 迁移 目前我正在尝试移植此呼叫 lkstat DBMS LOCK REQUEST lkhndl DBMS LOCK X MODE lktimeout true 这个功能 http docs oracle com cd
  • R 版本 4.0.0 上的 ROracle

    当尝试使用 ROracle 时 我收到以下错误消息 gt library ROracle Error package or namespace load failed for ROracle package ROracle was inst
  • 如何在oracle sql查询中提取括号之间的字符串

    我正在尝试从字符串中提取括号之间的值 我怎样才能做到这一点 例如 我有这个字符串 Gupta Abha 01792 我想得到括号之间的结果 即 01792 我正在尝试编写这样的查询 select substr Gupta Abha 0179
  • Oracle中“NUMBER”和“NUMBER(*,0)”相同吗?

    在甲骨文中文档 http docs oracle com cd B28359 01 server 111 b28318 datatype htm i22289据说 数字 精度 小数位数 如果未指定精度 则该列将存储给定的值 如果 未指定比例
  • 通过 OCI 调用 Oracle 存储过程并使用 C++ 中的 out ref 游标返回结果

    我想使用 OCI 接口从 C 调用 Oracle 存储过程 并使用 out SYS REF CURSOR 作为过程的参数来迭代结果 我是 OCI 新手 所以可能会遗漏一些简单的东西 大部分代码取自这里 我的存储过程是 CREATE OR R
  • 想要在Sql中获取两列的差异

    我想获取表的列的差异 我们的列名称为 Planned date 所以现在我想获取这两列的差异 A Planned Date of stop1 Planned Date of stop5 那么我如何编写查询来获取 A 的值 下面是我编写的示例
  • 在存储过程中使用动态sql中的临时表

    我正在 SQL Server 2012 中编写存储过程 我有一个像这样定义的临时表 DECLARE CURRENT RET WEEK PTIMEIDS TABLE PTIMEID INT 我也在使用EXECUTE编写动态 SQL 查询 有什
  • Oracle 11g XE - 突然出现 ORA-01034: ORACLE 不可用且 ORA-27101: 共享内存领域不存在

    Windows 7 32 位笔记本电脑 Oracle 11g XE 的本地实例 首先 在提出问题之前 我自己一直在研究这个问题 虽然有很多参考 建议 但我无法自己解决这个问题 突然 当我尝试登录本地 Oracle 11g XE 爱好者实例时
  • 我怎样才能等到所有调度程序作业完成?

    我是我的包裹 我正在排队多个作业 如下所示 dbms scheduler create job job name gt p job name job type gt PLSQL BLOCK job action gt p sql code
  • ORACLe PROCEDURE - AUTHID 仅允许在模式级别

    在尝试通过过程创建表时 我遇到了类似的错误 错误 73 9 PLS 00157 仅在架构级程序上允许 AUTHID PROCEDURE BCKUP AUTHID CURRENT USER AS statusmsg VARCHAR2 400
  • 如何从 Oracle 中获取格式化的 XML

    我对 Oracle 缺乏经验 并且在将数据导出为 XML 时遇到问题 我已经设法让这个查询正常工作 但 XML 的格式似乎是固定的 对我来说不起作用 这是查询 SELECT value em getClobVal AS output FRO
  • 如何查看授予其他用户的架构哪些权限

    考虑这种情况 在数据库中 我有两个用户 A 和 B 及其相应的架构 我想知道 如何获取信息 架构 B 中的用户 A 有哪些权限 考虑这种情况 我们有两个用户及其关联的场景 我们有用户A和用户B 在A中 假设我们有TB1 TB2 在B中 假设
  • 根据 Oracle SQL 中的营业时间计算时间

    我希望根据工作时间计算任务开始和结束之间的时间 我有以下示例数据 TASK START TIME END TIME A 16 JAN 17 10 00 23 JAN 17 11 35 B 18 JAN 17 17 53 19 JAN 17
  • Oracle SQL 触发器上的变异表

    我正在尝试执行触发器 但出现变异表错误 SQL 代码是这样的 CREATE OR REPLACE TRIGGER CHK Apartado D BEFORE INSERT OR UPDATE ON CONTRACTS FOR EACH RO
  • 当网站停止时,Oracle 数据提供程序会固定 IIS 工作进程

    我们在 Oracle 11g 第 2 版中遇到了一个严重的问题 其中 w3wp 进程接管了整个处理器核心 并且调试显示 Oracle 数据提供程序无限地抛出 ThreadAbortException 开发人员通过执行以下操作发现了此问题 1
  • 关于pl/sql存储程序文本的问题

    我使用 TOAD 进行 PL SQL 开发 在 TOAD 中 当我输入过程名称并按 f4 时 我可以看到该过程的源代码 我认为 TOAD 从 v sqltext 视图获取源代码 为了证实我的想法 我写了一个查询 select from v
  • 将 OraclePreparedStatement 与 DBCP 连接结合使用

    我正在尝试使用 dbcp 框架为我的 oracle 服务器创建一个连接池 我用过这个tutorial http web archive org web 20120615100115 http www freshblurbs com 80 j

随机推荐

  • C++ OS X 打开默认浏览器

    我想知道一种从 C 应用程序打开 OS X 上的默认浏览器 然后打开请求的 URL 的方法 编辑 我这样解决了 system open http www apple com 如果您更喜欢使用本机 OS X API 而不是system ope
  • C++ 枚举类整数不适用于数组下标

    我有以下枚举类 enum class EnumClass int A 0 B 现在我想用该枚举类型为数组添加下标 MyObject arr 2 MyObject a arr EnumClass A MyObject b arr EnumCl
  • 使用子句中的 Delphi 条件编译

    我正在尝试修改我的 Delphi 2010 代码以在 XE7 中编译 并希望保留在 2010 中编译它的能力 因此 在容纳我的主窗体的单元中 我添加了条件指令 以下内容在 2010 年运行良好 uses IF CompilerVersion
  • Visual Studio 只在第二行汇编时中断?

    简短描述 在我的第一行设置断点 CODE汇编程序中的段不会停止程序的执行 问题 Visual Studio 的调试器会导致它无法在用汇编语言编写的程序的第一行创建断点吗 这是调试器的一些奇怪之处 是中断多字节指令的情况 还是我只是做了一些愚
  • Jupyter找不到keras的模块

    我已经安装了 Anaconda 的 Tensorflow 和 Keras 在 Windows 10 上 我创建了一个使用 Python 3 5 2 的环境 Anaconda 中的原始环境是 Python 3 6 当我尝试执行时import
  • Java - 包私有类内的方法可访问性?

    如果我有一个包私有的java类 用 类 声明 而不是 公共类 那么里面的方法声明为公共或受保护或包私有实际上没有区别 对吗 那么我应该使用哪个 或者什么时候应该使用哪个 我有点困惑 如果我有一个包私有的java类 用 类 声明 而不是 公共
  • 关闭 Snackbar 时 FloatingActionButton 不会下降

    我正在尝试使用Snackbar 我有一个FloatingActionButton包裹在一个CoordinatorLayout 当 的时候Snackbar显示 按钮已正确向上移动 当它自动关闭时 按钮向下移动 但如果我驳回Snackbar以编
  • 奇怪的空指针异常

    我的 NPE 的 Stacktrace 开头是 Caused by java lang NullPointerException at pl yourvision crm web servlets listExport ProductLis
  • Safari MacOS 异物在 svg 内无法正确缩放

    UPDTATE 由于 Apple 是一家价值 2 万亿美元的公司 让我们尝试通过在此处提交错误报告来让他们解决此问题 https www apple com feedback safari html In Chrome and Firefo
  • IntelliJ:将私钥设置为环境变量不起作用(Spring boot项目)

    我有一个 Spring Boot 项目 如果我使用私钥 多行文本 它工作得很好 这意味着密钥没有问题 但是当我尝试将其设置为 intellij 中的环境变量时 它显示 原因 属性 spring cloud config server git
  • 在另一个应用程序中向我自己的 ContentProvider 请求读取权限

    在一个应用程序中 我在 AndroidManifest 中声明了以下内容提供程序
  • 理解 git Cherry-pick

    来自 svn 背景 我几乎从不分支 因为切换速度 缺乏 以及将分支合并回主干需要一个小时或更长时间 有时 如果我需要修复网站上的问题 我会在主干中进行更改 它将与以前的更改或新功能一起存在 然后转到该文件并执行 svn up path to
  • 在 Perl 正则表达式替换中使用 $1 与 \1 有什么区别?

    我正在调试一些代码 想知道 Perl 正则表达式替换中的 1 和 1 之间是否有任何实际差异 例如 my package name Some Package ButNotThis package name s w w 1 print pac
  • 如何修复错误:此服务需要项目 ID,但无法确定

    我正在尝试从 AppEngine 将数据插入 Google 数据存储区 但收到错误 java lang IllegalArgumentException A project ID is required for this service b
  • numpy fromiter 与列表生成器

    import numpy as np def gen c c np ones 5 dtype int j 0 t 10 while j lt t c 0 j yield c tolist j 1 What I did res np arra
  • 使用选择查询更新表

    所以我在这里读了一些帖子 但我似乎无法在 MySQL 上运行它 几乎我有一个带有 itemid 的记录 计数 我想根据 itemid 更新到我的 items 表中 items popularity 这是我尝试过的 Update items
  • Bash 中命令替换的变量赋值的退出代码

    我对明确执行变量赋值并使用命令替换时命令将返回什么错误代码感到困惑 a false echo 它输出1 这让我认为变量赋值不会清除最后一个错误代码或产生新的错误代码 但是当我尝试这个时 false a echo 它输出0 显然这就是a 返回
  • 有人使用 Swing 的“swingx”扩展吗? [关闭]

    这个问题不太可能对任何未来的访客有帮助 它只与一个较小的地理区域 一个特定的时间点或一个非常狭窄的情况相关 通常不适用于全世界的互联网受众 为了帮助使这个问题更广泛地适用 访问帮助中心 我在这里看到了 swingx 的提及和提及 但是 每次
  • 图像缩小算法

    您能帮我找到正确的图像调整大小算法吗 我有一个数字的图像 最大尺寸为 200x200 我需要获得尺寸为 15x15 甚至更小的图像 图像是单色的 黑白 结果应该是相同的 这就是关于我的任务的信息 我已经尝试过一种算法 这里是 xscale
  • 为什么我不能在动态 SQL 的 DDL/SCL 语句中使用绑定变量?

    我正在尝试使用绑定变量在动态 SQL 中执行 SQL 命令 this procedure is a part of PL SQL package Test Pkg PROCEDURE Set Nls Calendar calendar IN