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

桑帕氏菌

我正在尝试使用绑定变量在动态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语句中不允许绑定变量。因此,以下语句将导致错误:

问题

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

通常,应用程序会提示用户输入SQL语句的文本以及该语句中使用的主机变量的值。然后,Oracle解析SQL语句。也就是说,Oracle检查SQL语句以确保它遵循语法规则并引用有效的数据库对象。解析还涉及检查数据库访问权限1,保留所需的资源以及找到最佳访问路径。

1 答题者添加的重点

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

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

因此,答案是您无法在动态SQL中绑定架构元素,例如表名,列名。也不能绑定内置常量


实现动态引用架构元素/常量的唯一方法是在动态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 || '''';
    

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

为什么不能在 if 语句中使用空指针?

为什么不能在DELETE语句中使用别名?

为什么最终变量不能在switch语句中使用?

为什么不能在此if语句中使用我的变量?

为什么我不能在WHERE语句中使用变量?

我不能在 jinja 的 if 语句中使用变量

在 SQL 语句中使用 Session 变量

在like语句中使用SQL变量

不使用WHERE子句中的绑定变量执行的本机动态SQL DDL语句

为什么不能在switch语句中声明变量?

为什么不能在if语句中声明变量?

为什么在if语句中使用整数变量?

在SQL语句中使用未绑定的控制值

为什么我们不能在三元语句中使用“pass”?

为什么不能在switch语句中使用元组常量作为大小写

为什么我们不能在 switch 语句中使用关系表达式?

SwiftUI-为什么我不能在if语句中使用Alert

如何在Python的SQL语句中使用变量?

在SQL语句中使用变量-C接口

如何在sql语句中使用变量

从循环保存变量以在SQL语句中使用

在db2的fetch语句中使用sql变量

尝试在SQL WHERE IN语句中使用变量

为什么我不能在C ++中的三元条件语句中使用“ break”语句?

为什么我不能在一行语句中设置T-SQL CONTXT_INFO变量?

如何在case语句中使用优先值或在函数中的sql语句中的case语句中设置变量

为什么不能在 if....else 中使用 str 语句

为什么我在If语句中设置的变量不能在javascript中的if语句之外起作用?

如何在 Python 中使用 IN 语句在 SQL 语句中使用变量