【问题标题】:How do I use dynamic SQL to declare a column name derived from a table name?如何使用动态 SQL 声明从表名派生的列名?
【发布时间】:2011-03-27 07:30:39
【问题描述】:

Tony's answerthis question 为基础:

如果我想做这样的事情,

CREATE PROCEDURE A(tab IN VARCHAR2) IS
tab.col_name <column> --static declaration (column name always remains the same)
BEGIN
   EXECUTE IMMEDIATE 'INSERT INTO ' || tab(col_name) || 'VALUES(123)';
END A;

在上述情况下如何使用动态 SQL?

【问题讨论】:

  • 这是一个很好的问题...

标签: sql database stored-procedures plsql dynamic-sql


【解决方案1】:

这个例子传入了一个表名和一个列名:

CREATE PROCEDURE A
  ( tab IN VARCHAR2
  , col_name IN VARCHAR2
  ) IS
BEGIN
   EXECUTE IMMEDIATE 'INSERT INTO ' || tab || '(' || col_name || ') VALUES(123)';
END A;

您需要意识到 EXECUTE IMMEDIATE 之后的所有内容都必须是包含一些有效 SQL 的字符串。验证这一点的一个好方法是将其设置在一个变量中并将其打印到屏幕上:

CREATE PROCEDURE A
  ( tab IN VARCHAR2
  , col_name IN VARCHAR2
  ) IS
   v_sql VARCHAR2(2000);
BEGIN
   v_sql := 'INSERT INTO ' || tab || '(' || col_name || ') VALUES(123)';
   DBMS_OUTPUT.PUT_LINE('SQL='||v_sql);
   EXECUTE IMMEDIATE v_sql;
END A;

这应该会在 SQL Plus 中显示如下内容:

SQL=INSERT INTO mytable(mycolumn) 值(123)

(前提是服务器输出已打开)。

编辑:由于您希望列名是始终具有相同值的局部变量,因此可以这样做:

CREATE PROCEDURE A (tab IN VARCHAR2)
IS
   col_name VARCHAR2(30) := 'MYCOLUMN';
   v_sql VARCHAR2(2000);
BEGIN
   v_sql := 'INSERT INTO ' || tab || '(' || col_name || ') VALUES(123)';
   DBMS_OUTPUT.PUT_LINE('SQL='||v_sql);
   EXECUTE IMMEDIATE v_sql;
END A;

【讨论】:

  • 如果我不想将列名作为参数传递,而是想在过程中声明它怎么办。这可能吗?
  • 列名会一直相同吗?如果不是,您的程序是否应该以某种方式找出?请进一步说明您需要什么。
猜你喜欢
  • 2020-02-06
  • 2014-09-06
  • 1970-01-01
  • 1970-01-01
  • 2021-12-20
  • 1970-01-01
  • 1970-01-01
  • 2011-04-02
  • 1970-01-01
相关资源
最近更新 更多