Oracle 在PL-SQL中预期的位置未找到From关键字
我有以下代码:Oracle 在PL-SQL中预期的位置未找到From关键字,oracle,plsql,Oracle,Plsql,我有以下代码: v_SQL := ' -- ========================================================== -- Main Unpivot Table - To move years from column headings -- to rows values -- ========================================================== SELECT CAST(FieldYear AS
v_SQL := '
-- ==========================================================
-- Main Unpivot Table - To move years from column headings
-- to rows values
-- ==========================================================
SELECT
CAST(FieldYear AS Number) FieldYear
, FieldType
, CASE FieldValue
WHEN '''' THEN NULL
ELSE CAST (FieldValue AS Number(38,8))
END FieldValue
FROM
(SELECT ' ||
v_InsertType ||' AS FieldType
,Y1 as ' || CAST(v_FY0 - 5 - v_OffSet AS CHAR) || '
,Y2 as ' || CAST(v_FY0 - 4 - v_OffSet AS CHAR) || '
,Y3 as ' || CAST(v_FY0 - 3 - v_OffSet AS CHAR) || '
,Y4 as ' || CAST(v_FY0 - 2 - v_OffSet AS CHAR) || '
,Y5 as ' || CAST(v_FY0 - 1 - v_OffSet AS CHAR) || '
,Y6 as ' || CAST(v_FY0 - v_OffSet AS CHAR) || '
,Y7 as ' || CAST(v_FY0 + 1 - v_OffSet AS CHAR) || '
,Y8 as ' || CAST(v_FY0 + 2 - v_OffSet AS CHAR) || '
,Y9 as ' || CAST(v_FY0 + 3 - v_OffSet AS CHAR) || '
,Y10 as ' || CAST(v_FY0 + 4 - v_OffSet AS CHAR) || '
,Y11 as ' || CAST(v_FY0 + 5 - v_OffSet AS CHAR) || '
,Y12 as ' || CAST(v_FY0 + 6 - v_OffSet AS CHAR) || '
,Y13 as ' || CAST(v_FY0 + 7 - v_OffSet AS CHAR) || '
,Y14 as ' || CAST(v_FY0 + 8 - v_OffSet AS CHAR) || '
,Y15 as ' || CAST(v_FY0 + 9 - v_OffSet AS CHAR) || '
,Y16 as ' || CAST(v_FY0 + 10 - v_OffSet AS CHAR) || '
,Y17 as ' || CAST(v_FY0 + 11 - v_OffSet AS CHAR) || '
,Y18 as ' || CAST(v_FY0 + 12 - v_OffSet AS CHAR) || '
,Y19 as ' || CAST(v_FY0 + 13 - v_OffSet AS CHAR) || '
,Y20 as ' || CAST(v_FY0 + 14 - v_OffSet AS CHAR) || '
,Y21 as ' || CAST(v_FY0 + 15 - v_OffSet AS CHAR) || '
,Y22 as ' || CAST(v_FY0 + 16 - v_OffSet AS CHAR) || '
,Y23 as ' || CAST(v_FY0 + 17 - v_OffSet AS CHAR) || '
,Y24 as ' || CAST(v_FY0 + 18 - v_OffSet AS CHAR) || '
,Y25 as ' || CAST(v_FY0 + 19 - v_OffSet AS CHAR) || '
,Y26 as ' || CAST(v_FY0 + 20 - v_OffSet AS CHAR) || '
,Y27 as ' || CAST(v_FY0 + 21 - v_OffSet AS CHAR) || '
,Y28 as ' || CAST(v_FY0 + 22 - v_OffSet AS CHAR) || '
,Y29 as ' || CAST(v_FY0 + 23 - v_OffSet AS CHAR) || '
,Y30 as ' || CAST(v_FY0 + 24 - v_OffSet AS CHAR) || '
,Y31 as ' || CAST(v_FY0 + 25 - v_OffSet AS CHAR) || '
,Y32 as ' || CAST(v_FY0 + 26 - v_OffSet AS CHAR) || '
,Y33 as ' || CAST(v_FY0 + 27 - v_OffSet AS CHAR) || '
,Y34 as ' || CAST(v_FY0 + 28 - v_OffSet AS CHAR) || '
,Y35 as ' || CAST(v_FY0 + 29 - v_OffSet AS CHAR) || '
FROM ' ||
v_tblInsertType || ') UP
UNPIVOT
(FieldValue FOR FieldYear IN
(' || CAST(v_FY0 - 5 - v_OffSet AS CHAR) || '
,' || CAST(v_FY0 - 4 - v_OffSet AS CHAR) || '
,' || CAST(v_FY0 - 3 - v_OffSet AS CHAR) || '
,' || CAST(v_FY0 - 2 - v_OffSet AS CHAR) || '
,' || CAST(v_FY0 - 1 - v_OffSet AS CHAR) || '
,' || CAST(v_FY0 - v_OffSet AS CHAR) || '
,' || CAST(v_FY0 + 1 - v_OffSet AS CHAR) || '
,' || CAST(v_FY0 + 2 - v_OffSet AS CHAR) || '
,' || CAST(v_FY0 + 3 - v_OffSet AS CHAR) || '
,' || CAST(v_FY0 + 4 - v_OffSet AS CHAR) || '
,' || CAST(v_FY0 + 5 - v_OffSet AS CHAR) || '
,' || CAST(v_FY0 + 6 - v_OffSet AS CHAR) || '
,' || CAST(v_FY0 + 7 - v_OffSet AS CHAR) || '
,' || CAST(v_FY0 + 8 - v_OffSet AS CHAR) || '
,' || CAST(v_FY0 + 9 - v_OffSet AS CHAR) || '
,' || CAST(v_FY0 + 10 - v_OffSet AS CHAR) || '
,' || CAST(v_FY0 + 11 - v_OffSet AS CHAR) || '
,' || CAST(v_FY0 + 12 - v_OffSet AS CHAR) || '
,' || CAST(v_FY0 + 13 - v_OffSet AS CHAR) || '
,' || CAST(v_FY0 + 14 - v_OffSet AS CHAR) || '
,' || CAST(v_FY0 + 15 - v_OffSet AS CHAR) || '
,' || CAST(v_FY0 + 16 - v_OffSet AS CHAR) || '
,' || CAST(v_FY0 + 17 - v_OffSet AS CHAR) || '
,' || CAST(v_FY0 + 18 - v_OffSet AS CHAR) || '
,' || CAST(v_FY0 + 19 - v_OffSet AS CHAR) || '
,' || CAST(v_FY0 + 20 - v_OffSet AS CHAR) || '
,' || CAST(v_FY0 + 21 - v_OffSet AS CHAR) || '
,' || CAST(v_FY0 + 22 - v_OffSet AS CHAR) || '
,' || CAST(v_FY0 + 23 - v_OffSet AS CHAR) || '
,' || CAST(v_FY0 + 24 - v_OffSet AS CHAR) || '
,' || CAST(v_FY0 + 25 - v_OffSet AS CHAR) || '
,' || CAST(v_FY0 + 26 - v_OffSet AS CHAR) || '
,' || CAST(v_FY0 + 27 - v_OffSet AS CHAR) || '
,' || CAST(v_FY0 + 28 - v_OffSet AS CHAR) || '
,' || CAST(v_FY0 + 29 - v_OffSet AS CHAR) || '
)
)AS unpvt
Execute immediate v_SQL;
式中,v_FY0为数字(10);v_SQL NVarchar2(4000),v_InsertType VARCHAR2(4000);和v_偏移编号(10);v_tblInsertType VARCHAR2(4000)
执行时,我得到:v_FY0=2018,v_OffSet=0
执行时,我得到错误-ORA-00923:FROM关键字未在预期位置找到
如何解决此问题以及如何使其正常工作。您不能在
from
子句中使用as
此查询:
select * from (select dummy from dual) as tab
产生错误ORA-00933
。因此,只需将删除为:
select * from (select dummy from dual) tab
不能在from
子句中使用as
此查询:
select * from (select dummy from dual) as tab
产生错误ORA-00933
。因此,只需将删除为:
select * from (select dummy from dual) tab
下面是修改后的代码,它为我提供了所需的答案:
v_SQL := '
-- ==========================================================
-- Main Unpivot Table - To move years from column headings
-- to rows values
-- ==========================================================
SELECT
CAST(FieldYear AS Number) FieldYear
, FieldType
, CASE FieldValue
WHEN n'''' THEN NULL
ELSE CAST (FieldValue AS Number(38,8))
END FieldValue
FROM
(SELECT ' ||
v_InsertType ||' AS FieldType
,Y1 as "' || CAST(v_FY0 - 5 - v_OffSet AS CHAR) || '"
,Y2 as "' || CAST(v_FY0 - 4 - v_OffSet AS CHAR) || '"
,Y3 as "' || CAST(v_FY0 - 3 - v_OffSet AS CHAR) || '"
,Y4 as "' || CAST(v_FY0 - 2 - v_OffSet AS CHAR) || '"
,Y5 as "' || CAST(v_FY0 - 1 - v_OffSet AS CHAR) || '"
,Y6 as "' || CAST(v_FY0 - v_OffSet AS CHAR) || '"
,Y7 as "' || CAST(v_FY0 + 1 - v_OffSet AS CHAR) || '"
,Y8 as "' || CAST(v_FY0 + 2 - v_OffSet AS CHAR) || '"
,Y9 as "' || CAST(v_FY0 + 3 - v_OffSet AS CHAR) || '"
,Y10 as "' || CAST(v_FY0 + 4 - v_OffSet AS CHAR) || '"
,Y11 as "' || CAST(v_FY0 + 5 - v_OffSet AS CHAR) || '"
,Y12 as "' || CAST(v_FY0 + 6 - v_OffSet AS CHAR) || '"
,Y13 as "' || CAST(v_FY0 + 7 - v_OffSet AS CHAR) || '"
,Y14 as "' || CAST(v_FY0 + 8 - v_OffSet AS CHAR) || '"
,Y15 as "' || CAST(v_FY0 + 9 - v_OffSet AS CHAR) || '"
,Y16 as "' || CAST(v_FY0 + 10 - v_OffSet AS CHAR) || '"
,Y17 as "' || CAST(v_FY0 + 11 - v_OffSet AS CHAR) || '"
,Y18 as "' || CAST(v_FY0 + 12 - v_OffSet AS CHAR) || '"
,Y19 as "' || CAST(v_FY0 + 13 - v_OffSet AS CHAR) || '"
,Y20 as "' || CAST(v_FY0 + 14 - v_OffSet AS CHAR) || '"
,Y21 as "' || CAST(v_FY0 + 15 - v_OffSet AS CHAR) || '"
,Y22 as "' || CAST(v_FY0 + 16 - v_OffSet AS CHAR) || '"
,Y23 as "' || CAST(v_FY0 + 17 - v_OffSet AS CHAR) || '"
,Y24 as "' || CAST(v_FY0 + 18 - v_OffSet AS CHAR) || '"
,Y25 as "' || CAST(v_FY0 + 19 - v_OffSet AS CHAR) || '"
,Y26 as "' || CAST(v_FY0 + 20 - v_OffSet AS CHAR) || '"
,Y27 as "' || CAST(v_FY0 + 21 - v_OffSet AS CHAR) || '"
,Y28 as "' || CAST(v_FY0 + 22 - v_OffSet AS CHAR) || '"
,Y29 as "' || CAST(v_FY0 + 23 - v_OffSet AS CHAR) || '"
,Y30 as "' || CAST(v_FY0 + 24 - v_OffSet AS CHAR) || '"
,Y31 as "' || CAST(v_FY0 + 25 - v_OffSet AS CHAR) || '"
,Y32 as "' || CAST(v_FY0 + 26 - v_OffSet AS CHAR) || '"
,Y33 as "' || CAST(v_FY0 + 27 - v_OffSet AS CHAR) || '"
,Y34 as "' || CAST(v_FY0 + 28 - v_OffSet AS CHAR) || '"
,Y35 as "' || CAST(v_FY0 + 29 - v_OffSet AS CHAR) || '"
FROM ' ||
v_tblInsertType || ') UP
UNPIVOT
(FieldValue FOR FieldYear IN
("' || CAST(v_FY0 - 5 - v_OffSet AS CHAR) || '"
,"' || CAST(v_FY0 - 4 - v_OffSet AS CHAR) || '"
,"' || CAST(v_FY0 - 3 - v_OffSet AS CHAR) || '"
,"' || CAST(v_FY0 - 2 - v_OffSet AS CHAR) || '"
,"' || CAST(v_FY0 - 1 - v_OffSet AS CHAR) || '"
,"' || CAST(v_FY0 - v_OffSet AS CHAR) || '"
,"' || CAST(v_FY0 + 1 - v_OffSet AS CHAR) || '"
,"' || CAST(v_FY0 + 2 - v_OffSet AS CHAR) || '"
,"' || CAST(v_FY0 + 3 - v_OffSet AS CHAR) || '"
,"' || CAST(v_FY0 + 4 - v_OffSet AS CHAR) || '"
,"' || CAST(v_FY0 + 5 - v_OffSet AS CHAR) || '"
,"' || CAST(v_FY0 + 6 - v_OffSet AS CHAR) || '"
,"' || CAST(v_FY0 + 7 - v_OffSet AS CHAR) || '"
,"' || CAST(v_FY0 + 8 - v_OffSet AS CHAR) || '"
,"' || CAST(v_FY0 + 9 - v_OffSet AS CHAR) || '"
,"' || CAST(v_FY0 + 10 - v_OffSet AS CHAR) || '"
,"' || CAST(v_FY0 + 11 - v_OffSet AS CHAR) || '"
,"' || CAST(v_FY0 + 12 - v_OffSet AS CHAR) || '"
,"' || CAST(v_FY0 + 13 - v_OffSet AS CHAR) || '"
,"' || CAST(v_FY0 + 14 - v_OffSet AS CHAR) || '"
,"' || CAST(v_FY0 + 15 - v_OffSet AS CHAR) || '"
,"' || CAST(v_FY0 + 16 - v_OffSet AS CHAR) || '"
,"' || CAST(v_FY0 + 17 - v_OffSet AS CHAR) || '"
,"' || CAST(v_FY0 + 18 - v_OffSet AS CHAR) || '"
,"' || CAST(v_FY0 + 19 - v_OffSet AS CHAR) || '"
,"' || CAST(v_FY0 + 20 - v_OffSet AS CHAR) || '"
,"' || CAST(v_FY0 + 21 - v_OffSet AS CHAR) || '"
,"' || CAST(v_FY0 + 22 - v_OffSet AS CHAR) || '"
,"' || CAST(v_FY0 + 23 - v_OffSet AS CHAR) || '"
,"' || CAST(v_FY0 + 24 - v_OffSet AS CHAR) || '"
,"' || CAST(v_FY0 + 25 - v_OffSet AS CHAR) || '"
,"' || CAST(v_FY0 + 26 - v_OffSet AS CHAR) || '"
,"' || CAST(v_FY0 + 27 - v_OffSet AS CHAR) || '"
,"' || CAST(v_FY0 + 28 - v_OffSet AS CHAR) || '"
,"' || CAST(v_FY0 + 29 - v_OffSet AS CHAR) || '"
)
) unpvt' ;
Execute immediate v_SQL;
下面是修改后的代码,它为我提供了所需的答案:
v_SQL := '
-- ==========================================================
-- Main Unpivot Table - To move years from column headings
-- to rows values
-- ==========================================================
SELECT
CAST(FieldYear AS Number) FieldYear
, FieldType
, CASE FieldValue
WHEN n'''' THEN NULL
ELSE CAST (FieldValue AS Number(38,8))
END FieldValue
FROM
(SELECT ' ||
v_InsertType ||' AS FieldType
,Y1 as "' || CAST(v_FY0 - 5 - v_OffSet AS CHAR) || '"
,Y2 as "' || CAST(v_FY0 - 4 - v_OffSet AS CHAR) || '"
,Y3 as "' || CAST(v_FY0 - 3 - v_OffSet AS CHAR) || '"
,Y4 as "' || CAST(v_FY0 - 2 - v_OffSet AS CHAR) || '"
,Y5 as "' || CAST(v_FY0 - 1 - v_OffSet AS CHAR) || '"
,Y6 as "' || CAST(v_FY0 - v_OffSet AS CHAR) || '"
,Y7 as "' || CAST(v_FY0 + 1 - v_OffSet AS CHAR) || '"
,Y8 as "' || CAST(v_FY0 + 2 - v_OffSet AS CHAR) || '"
,Y9 as "' || CAST(v_FY0 + 3 - v_OffSet AS CHAR) || '"
,Y10 as "' || CAST(v_FY0 + 4 - v_OffSet AS CHAR) || '"
,Y11 as "' || CAST(v_FY0 + 5 - v_OffSet AS CHAR) || '"
,Y12 as "' || CAST(v_FY0 + 6 - v_OffSet AS CHAR) || '"
,Y13 as "' || CAST(v_FY0 + 7 - v_OffSet AS CHAR) || '"
,Y14 as "' || CAST(v_FY0 + 8 - v_OffSet AS CHAR) || '"
,Y15 as "' || CAST(v_FY0 + 9 - v_OffSet AS CHAR) || '"
,Y16 as "' || CAST(v_FY0 + 10 - v_OffSet AS CHAR) || '"
,Y17 as "' || CAST(v_FY0 + 11 - v_OffSet AS CHAR) || '"
,Y18 as "' || CAST(v_FY0 + 12 - v_OffSet AS CHAR) || '"
,Y19 as "' || CAST(v_FY0 + 13 - v_OffSet AS CHAR) || '"
,Y20 as "' || CAST(v_FY0 + 14 - v_OffSet AS CHAR) || '"
,Y21 as "' || CAST(v_FY0 + 15 - v_OffSet AS CHAR) || '"
,Y22 as "' || CAST(v_FY0 + 16 - v_OffSet AS CHAR) || '"
,Y23 as "' || CAST(v_FY0 + 17 - v_OffSet AS CHAR) || '"
,Y24 as "' || CAST(v_FY0 + 18 - v_OffSet AS CHAR) || '"
,Y25 as "' || CAST(v_FY0 + 19 - v_OffSet AS CHAR) || '"
,Y26 as "' || CAST(v_FY0 + 20 - v_OffSet AS CHAR) || '"
,Y27 as "' || CAST(v_FY0 + 21 - v_OffSet AS CHAR) || '"
,Y28 as "' || CAST(v_FY0 + 22 - v_OffSet AS CHAR) || '"
,Y29 as "' || CAST(v_FY0 + 23 - v_OffSet AS CHAR) || '"
,Y30 as "' || CAST(v_FY0 + 24 - v_OffSet AS CHAR) || '"
,Y31 as "' || CAST(v_FY0 + 25 - v_OffSet AS CHAR) || '"
,Y32 as "' || CAST(v_FY0 + 26 - v_OffSet AS CHAR) || '"
,Y33 as "' || CAST(v_FY0 + 27 - v_OffSet AS CHAR) || '"
,Y34 as "' || CAST(v_FY0 + 28 - v_OffSet AS CHAR) || '"
,Y35 as "' || CAST(v_FY0 + 29 - v_OffSet AS CHAR) || '"
FROM ' ||
v_tblInsertType || ') UP
UNPIVOT
(FieldValue FOR FieldYear IN
("' || CAST(v_FY0 - 5 - v_OffSet AS CHAR) || '"
,"' || CAST(v_FY0 - 4 - v_OffSet AS CHAR) || '"
,"' || CAST(v_FY0 - 3 - v_OffSet AS CHAR) || '"
,"' || CAST(v_FY0 - 2 - v_OffSet AS CHAR) || '"
,"' || CAST(v_FY0 - 1 - v_OffSet AS CHAR) || '"
,"' || CAST(v_FY0 - v_OffSet AS CHAR) || '"
,"' || CAST(v_FY0 + 1 - v_OffSet AS CHAR) || '"
,"' || CAST(v_FY0 + 2 - v_OffSet AS CHAR) || '"
,"' || CAST(v_FY0 + 3 - v_OffSet AS CHAR) || '"
,"' || CAST(v_FY0 + 4 - v_OffSet AS CHAR) || '"
,"' || CAST(v_FY0 + 5 - v_OffSet AS CHAR) || '"
,"' || CAST(v_FY0 + 6 - v_OffSet AS CHAR) || '"
,"' || CAST(v_FY0 + 7 - v_OffSet AS CHAR) || '"
,"' || CAST(v_FY0 + 8 - v_OffSet AS CHAR) || '"
,"' || CAST(v_FY0 + 9 - v_OffSet AS CHAR) || '"
,"' || CAST(v_FY0 + 10 - v_OffSet AS CHAR) || '"
,"' || CAST(v_FY0 + 11 - v_OffSet AS CHAR) || '"
,"' || CAST(v_FY0 + 12 - v_OffSet AS CHAR) || '"
,"' || CAST(v_FY0 + 13 - v_OffSet AS CHAR) || '"
,"' || CAST(v_FY0 + 14 - v_OffSet AS CHAR) || '"
,"' || CAST(v_FY0 + 15 - v_OffSet AS CHAR) || '"
,"' || CAST(v_FY0 + 16 - v_OffSet AS CHAR) || '"
,"' || CAST(v_FY0 + 17 - v_OffSet AS CHAR) || '"
,"' || CAST(v_FY0 + 18 - v_OffSet AS CHAR) || '"
,"' || CAST(v_FY0 + 19 - v_OffSet AS CHAR) || '"
,"' || CAST(v_FY0 + 20 - v_OffSet AS CHAR) || '"
,"' || CAST(v_FY0 + 21 - v_OffSet AS CHAR) || '"
,"' || CAST(v_FY0 + 22 - v_OffSet AS CHAR) || '"
,"' || CAST(v_FY0 + 23 - v_OffSet AS CHAR) || '"
,"' || CAST(v_FY0 + 24 - v_OffSet AS CHAR) || '"
,"' || CAST(v_FY0 + 25 - v_OffSet AS CHAR) || '"
,"' || CAST(v_FY0 + 26 - v_OffSet AS CHAR) || '"
,"' || CAST(v_FY0 + 27 - v_OffSet AS CHAR) || '"
,"' || CAST(v_FY0 + 28 - v_OffSet AS CHAR) || '"
,"' || CAST(v_FY0 + 29 - v_OffSet AS CHAR) || '"
)
) unpvt' ;
Execute immediate v_SQL;
为什么不尝试通过dbms_output.put_行输出v_sql
变量的结果?这样您就可以看到创建的查询是什么,并且应该能够更容易地发现问题。请尝试将)作为unpvt
更改为)unpvt
。将删除为@Pounderstibbons-这实际上是答案(而不仅仅是一条评论)。不妨将其作为答案发布。顺便说一下立即执行v_SQL代码>对于select查询没有用处,除非您将结果存储在某个地方。它不会返回任何结果。如果您使用的是12c及以上版本,DBMS\u SQL.RETURN\u RESULT
对于动态光标可能很有用。为什么不尝试通过DBMS\u output.put\u行输出v\u SQL
变量的结果?然后您可以看到创建的查询是什么,您应该能够更容易地发现问题。请尝试将)更改为unpvt
,以)unpvt
。将删除为@Pounderstibbons-这实际上是答案(而不仅仅是一条评论)。不妨将其作为答案发布。顺便说一下立即执行v_SQL代码>对于select查询没有用处,除非您将结果存储在某个地方。它不会返回任何结果。如果您使用的是12c及以上版本,DBMS\u SQL.RETURN\u RESULT
对于动态游标可能很有用。