当表名是参数时,Oracle使用动态sql

时间:2013-12-30 12:45:57

标签: oracle dynamic-sql

我有一个想要转换为PLSQL的SQL查询(存储过程) 我已经转换了大部分商店程序,但我无法转换以下部分:

DECLARE lookupTableRow CURSOR FOR
  SELECT TableName FROM SYS_LookUpTable
  OPEN lookupTableRow
  FETCH NEXT FROM lookupTableRow INTO @tableName
  WHILE @@FETCH_STATUS=0
  BEGIN

  SET @sql='SELECT * FROM '+@tableName
EXECUTE sp_executesql @sql

  IF @counter=0
  BEGIN
  INSERT INTO T_TABLE_MAPPING VALUES('P_MAIN_METADATA', 'Table', @tableName)
  END
  ELSE
  BEGIN
  INSERT INTO T_TABLE_MAPPING 
      VALUES(  'P_MAIN_METADATA', 
               'Table' + CONVERT(NVARCHAR(10),@counter), 
               @tableName)
  END

  SET @counter=@counter+1
  FETCH NEXT FROM lookupTableRow INTO @tableName
  END
  CLOSE lookupTableRow
  DEALLOCATE lookupTableRow

据我所知,当表名是参数时,我无法使用ORACLE动态sql(执行立即执行)。

此外,当我在SQL存储过程中执行此动态查询时,每个SELECT语句都会返回相应的表行,这些结果在每个循环中都是不同的。

请提供任何解决方案的建议 *如何使用带有表名的动态sql作为参数? *我如何使用“动态”光标,以便能够显示动态结果?

感谢您的建议

2 个答案:

答案 0 :(得分:1)

如果您唯一不知道如何做的是动态使用表名,那么这就是您可以实现的目标

  1  declare
  2     n number;
  3     table_name varchar2(30) := 'dual';
  4  begin
  5     execute immediate 'select count(*) from ' || table_name into n;
  6     dbms_output.put_line(n);
  7* end;
SQL> /
1

答案 1 :(得分:0)

如果您只是尝试填充将表名称混淆为其他内容的表,为什么要按顺序强制数据库更改上下文并减慢速度呢?

Create table t_table_mapping as 
(    Select 'P_MAIN_METADATA' "P_MAIN_METADATA", 
      'Table' || to_char(rownum) as "Table", table_name 
     from all_tables)

但是,这并没有考虑架构名称所以所有者。因此,您需要添加一个where子句来限制您希望为此执行此操作的特定架构。