【问题标题】:fetch table name from a column for from clause从子句的列中获取表名
【发布时间】:2017-05-23 07:20:18
【问题描述】:

我有一个视图 t,其中有一列是表名,另一列是 where 子句条件。

    id| name|table_in| where_clause

    1 | Sam | t1 | age = 22

    2 | John| t2 | age = 23 and sex = 'male'

等等……

现在,我已将记录放在游标中,我想运行每个查询。

    create or replace procedure create_cursor 
    is

    CURSOR v_records is
    select * from t ;

    begin

    FOR temp IN v_records LOOP
        INSERT INTO myTable (id, name)
        select temp.id, temp.name 
        from temp.table where temp.where_clause;

        END LOOP;


    end;
    /

myTable 是另一个表,我想在其中放置记录以供下次使用。

【问题讨论】:

  • 请说明您的要求。这段代码有两种可能的解释。

标签: sql database oracle plsql procedure


【解决方案1】:

@Akshay,

请在下面找到代码供您参考。

Create or replace procedure create_cursor is
l_statement varchar2(32767);
cursor v_records is
  select * from t;
begin
for temp in v_records
loop
  l_statement := 'INSERT INTO myTable (id, name) select '||temp.id||','
   ||temp.name|| ' from ' || temp.table1 
   || ' where ' || temp.where_clause;

  execute immediate l_statement;
  end loop;
end;
/

【讨论】:

  • 他犯了语法错误。请检查akshay给出的评论。他说有一个错误“缺失值”。因此我进行了编辑。请在发表评论和投反对票之前检查。
  • 我已经在我的 sql 中做了这个改变,所以我没有提到它。问题是程序没有执行。
  • @APC 我希望你知道如何运行和编译 plsql。在发布代码不起作用之前,请检查并使用有效数据运行代码。请学习如何设置数据以运行 plsql 代码。如果你不这样做,那么运行代码并不容易。同样根据我的编辑其他帖子是不道德的。学习理解plsql,然后发布cmets。干杯。请在下面找到屏幕截图。
  • @APC 无法理解您从何处获得 ORA-00904。严重地。这让我很开心。我已经动态地使用了列名。猜猜你的数据问题是什么。由于您错误地设置了数据,因此您收到了该 oracle 错误消息。您无法理解错误消息,因此“让投票”是您的意识形态。Way To Go!!!!
  • @APC 我刚刚证明该代码有效。在发布或否决其他人之前,最好学会设置数据并尝试代码。谢谢。
【解决方案2】:

您需要动态 sql 来执行此操作:

CREATE OR REPLACE PROCEDURE create_cursor
IS
  l_statement VARCHAR2(32767);
  CURSOR v_records
  IS
    SELECT * FROM t;
BEGIN
  FOR temp IN v_records
  LOOP
    l_statement := 'INSERT INTO myTable (id, name)
          select id, name from ' || temp.table || 
          ' where ' || temp.where_clause;
    EXECUTE immediate l_statement;
  END LOOP;
END;
/

【讨论】:

  • 它在执行行中给我一个错误并说'缺少值关键字'
  • 在执行前输出语句,看看它长什么样。也许我在某处犯了语法错误。虽然我觉得它看起来不错。
  • name 将类似于“Sam”或“John”,因此需要引号。但是我希望看到`ORA-00904:“Sam”:无效标识符'。一旦您发布了失败的生成 INSERT 语句,这可能很容易解决。
  • 修复了代码。在动态insert 中,NAME 和 ID 是属于所选表(T1、T2)的列,因此它们不应与游标名称起别名
  • @WilliamRobertson - 我认为这条评论实际上是指另一个发布的“解决方案”
猜你喜欢
  • 1970-01-01
  • 2011-12-03
  • 1970-01-01
  • 2020-08-06
  • 1970-01-01
  • 2022-12-31
  • 2010-10-04
  • 1970-01-01
相关资源
最近更新 更多