我有一个想要转换为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作为参数? *我如何使用“动态”光标,以便能够显示动态结果?
感谢您的建议
答案 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子句来限制您希望为此执行此操作的特定架构。