形成动态 PLSQL 时出错

Getting error while forming Dynamic PLSQL

我正在尝试形成以下 SQL 声明。但得到这个我似乎无法弄清楚的奇怪错误。我在循环外单独执行了每个语句,它们工作正常。请有人帮我找出错误。

错误

ORA-06550: line 6, column 14:
PLS-00306: wrong number or types of arguments in call to '||'
ORA-06550: line 6, column 7:
PL/SQL: Statement ignored
06550. 00000 -  "line %s, column %s:\n%s"
*Cause:    Usually a PL/SQL compilation error.
*Action:

PLSQL 声明:

 DECLARE
 L_sql VARCHAR2(2000):=NULL;
BEGIN      
FOR val IN (SELECT generation_qtr from test_1) 
  LOOP
      L_sql:=L_sql ||' MAX(DECODE(generation_qtr, '||''''||val||''''||' cum_actual_gen)) AS ' || val ||','||chr(10);
  END LOOP;
  L_sql:='SELECT assetname, '|| L_sql;
  L_sql:=substr(L_sql,1,LENGTH(L_sql)-1);
dbms_output.put_line(L_sql);
END;

甲骨文版本-11.2

您直接指的是 val,但那是游标行类型。您需要指定列名,即使只有一个:

... ||val.generation_qtr|| ...

... 在这两个地方,您都在串联中使用它。所以它会变成:

      L_sql:=L_sql ||' MAX(DECODE(generation_qtr, '||''''
        || val.generation_qtr ||''''||' cum_actual_gen)) AS '
        || val.generation_qtr ||','||chr(10);

如果您要动态执行此操作,那么换行符不会很有用,但我想它们有助于调试。