oracle 动态 sql 使用带括号的参数作为表名

Posted

技术标签:

【中文标题】oracle 动态 sql 使用带括号的参数作为表名【英文标题】:oracle dynamic sql using params with brackets as table name 【发布时间】:2013-05-14 17:14:17 【问题描述】:

我的架构中有一个表,其名称中带有括号(这是遗留的,无法修改):

CREATE TABLE "Addresses"
    ("ID"                        NUMBER(*,0) ,
    "FullAddress"                  NVARCHAR2(100),
    "HomeNum"                      NVARCHAR2(25),
    "StreetName"                   NVARCHAR2(50)
)

所以我想要的是能够通过动态 sql 更新这个表。这就是我尝试这样做的方式:

DECLARE 
  sql_upd_statement VARCHAR2(500) := '';
  table_name VARCHAR2(20) := '"Addresses"';
  column_name VARCHAR2(20) := '"FullAddress"';
BEGIN

   --no rows will be updated, just a sample 
   sql_upd_statement := 'UPDATE stm.:1 SET :2 = SUBSTR( :2, 2 ) WHERE :2 IS NOT NULL AND :2 IS NULL';

   dbms_output.put_line( sql_upd_statement );

  EXECUTE IMMEDIATE  sql_upd_statement USING IN table_name, column_name;

END;

请告诉我,是否可以通过动态 sql 达到我想要的效果?尝试设置不带括号的 'table_name'、'column_name' 值 - 仍然没有运气。

【问题讨论】:

我在您的表名中没有看到任何括号。 【参考方案1】:

架构对象名称不能使用绑定变量传递,它们必须是文字。

sql_upd_statement := 'UPDATE stm.'||table_name||' SET '||column_name||' = SUBSTR( '||column_name||', 2 ) WHERE '||column_name||' IS NOT NULL AND '||column_name||' IS NULL';

【讨论】:

谢谢,希望我只是错过了一些东西。好的,那么:)

以上是关于oracle 动态 sql 使用带括号的参数作为表名的主要内容,如果未能解决你的问题,请参考以下文章

使用 Oracle 表作为输入参数编写 Oracle 存储过程

如何用oracle动态查询一张表里面的某些列?

在sql语句中,怎样将参数做为表名传递到查询语句中

Oracle PL/SQL - 循环值作为没有动态 SQL 的动态列名

oracle的查询嵌套两层括号关联不上表

使用嵌套表在 Oracle PL/SQL 中构建动态 SQL