【问题标题】:What characters are allowed in Oracle bind param placeholders?Oracle 绑定参数占位符中允许使用哪些字符?
【发布时间】:2011-10-13 10:18:28
【问题描述】:

谁能指出绑定变量名允许的字符在哪里列出?我花了几个小时在 Oracle SQL 文档中挖掘,但无济于事。

我的意思是下面的“:id”:

SELECT * FROM mytable WHERE id = :id

例如可以在那里使用像“:some.id”这样的点吗?它会和没有点的版本完全一样吗?

【问题讨论】:

  • 为什么不自己尝试一下?
  • 我需要确保它已记录在案,因此对于 10 版以上的所有 Oracle 版本都有效。
  • PL/SQL 不需要这种绑定变量,除非您使用 EXECUTE IMMEDIATE。这是为了立即执行吗?还是您指的是在 SQLplus、JDBC 或 ADO.NET 等其他上下文中使用绑定变量?
  • @Codo:是的,这不适用于 PL/SQL,我使用的是 ODAC
  • @AlexJenter:你确定同样的规则适用于 ADO.NET、ODBC 和 SQLplus?如果没有,请具体说明您正在使用什么。 ODAC 包含所有这三个。请删除“plsql”标签,因为您的问题与它无关。

标签: sql database oracle parameters


【解决方案1】:

这些页面的状态绑定变量都必须是“合法的 Oracle 标识符” 我找到的文档并没有具体说明点可以 成为合法身份的一部分。我能够在两者中使用一个点 一个表名和一个绑定变量名,但它看起来像 不推荐。

绑定变量命名约定的页面 (这些页面声明绑定变量必须是合法标识符):

http://www.utoug.org/i/doc/concept_bind_var.htm

http://docs.oracle.com/cd/E23903_01/doc.41/e21674/concept_ses_val.htm#BEIEGCCC

描述法律标识符的页面: http://docs.oracle.com/cd/B19306_01/server.102/b14200/sql_elements008.htm

我在此页面上找不到任何内容表明点是合法的 标识符的一部分(例如表或绑定变量名称),但在 DB 链接中除外。 尽管 $ 和 # 是合法的,但它们甚至不被推荐,所以 "." 可能有效,但显然不推荐(甚至没有提到是合法的 本页)

绑定变量名称必须与项目名称相对应。 绑定变量名称不区分大小写。 绑定变量名称不能超过 30 个字符(即,它们必须是有效的 Oracle 标识符)。

我知道一个有效的 ORACLE 标识符(基于 ORACLE 的定义) 的合法标识符)不能以数字开头, 并且可以包含一些特殊字符,例如 $ 和 .但如果有 标识符必须用双引号括起来的特殊字符。

我能够获得一个带点的标识符以在绑定中工作 变量,但我必须在绑定周围加上双引号 当绑定变量中有一个点时的变量。

create or replace function F0416B
RETURN VARCHAR2
is
    V_STMT    VARCHAR2(1999);
    V_RESULT  VARCHAR2(1999);
BEGIN 
    V_STMT := 'INSERT INTO TEST0411(FIELD1, FIELD2) VALUES ( :"A.1" , :"A.2")';
    EXECUTE IMMEDIATE V_STMT USING  'AS201', 'AS202';
    RETURN 'INSERT-OK';
    COMMIT;
EXCEPTION
WHEN OTHERS THEN RETURN SQLERRM;
END;    

#这可能有效,但根据上述文档,一个句点/点 在绑定变量或其他对象名称中不合法/不推荐...

#这是ORACLE架构对象命名页面上的那句话 告诉我这个:

不带引号的标识符只能包含数据库字符集中的字母数字字符以及下划线 (_)、美元符号 ($) 和井号 (#)。数据库链接还可以包含句点 (.) 和“at”符号 (@)。 Oracle 强烈建议您不要在未加引号的标识符中使用 $ 和 #。

【讨论】:

    【解决方案2】:

    我也很难找到官方的 Oracle 文档:http://docs.oracle.com/cd/E14072_01/appdev.112/e10646/oci04sql.htm#i420655

    最重要的是,事实证明您可以引用占位符 (:"_normallyinvalid"),然后前面链接中列出的大多数规则都不再相关。我找不到任何提供此建议的 Oracle 文档;只是在互联网上的提示。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-12-30
      • 2018-02-07
      • 2011-06-15
      • 2011-10-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多