任何人都可以帮我找出错误。
create or replace procedure sample
is
begin
DECLARE AGG_COLUMNS VARCHAR2(2000);
BEGIN
EXECUTE IMMEDIATE 'SELECT COLUMNS FROM COLUMN_NAMES' INTO AGG_COLUMNS;
END;
begin
EXECUTE IMMEDIATE
'CREATE TABLE NEW_BW_COLUMN_ROW_CELL_JOIN AS
(
SELECT *
FROM BW_COLUMN_ROW_CELL_JOIN
PIVOT
(
MAX(STRING_VALUE)
FOR COLUMN_NAME IN ('||AGG_COLUMNS||')))';
END;
end;
Error(9,5): PL/SQL: Statement ignored
Error(17,36): PLS-00201: identifier 'AGG_COLUMNS' must be declared
由于
答案 0 :(得分:0)
立即错误是在第一个嵌套的PL / SQL块中声明了局部变量AGG_COLUMNS
。这意味着只要第一个嵌套块完成,它就会超出范围。因此,您不能在第二个嵌套的PL / SQL块中使用它。您可以通过在过程的声明部分中声明局部变量来解决此问题。您还可以摆脱嵌套的PL / SQL块
create or replace procedure sample
is
AGG_COLUMNS VARCHAR2(2000);
begin
EXECUTE IMMEDIATE 'SELECT COLUMNS FROM COLUMN_NAMES' INTO AGG_COLUMNS;
EXECUTE IMMEDIATE
'CREATE TABLE NEW_BW_COLUMN_ROW_CELL_JOIN AS
(
SELECT *
FROM BW_COLUMN_ROW_CELL_JOIN
PIVOT
(
MAX(STRING_VALUE)
FOR COLUMN_NAME IN ('||AGG_COLUMNS||')))';
end;
这应该删除立即编译错误。不过,我不确定这是否可以解决你所有的问题。
COLUMN_NAMES
不是默认Oracle安装中的表。这必须是您为了运行此代码而创建的内容。 COLUMN_NAMES
表,并且COLUMNS
存储了逗号分隔的字符串,则无需使用动态SQL来查询表。你可以做一个简单的SELECT ... INTO
。