SQL 命令未在动态 sql 查询 oracle 中正确结束?
SQL command not properly ended in dynamic sql query oracle?
我收到一个错误
SQL command not properly ended
虽然 p_sql
变量包含有效的 SQL 查询,但无需执行和循环。
也许这是由于 execute immediate
的限制
declare
p_sql clob;
begin
for naprav in (select naprav_name from naprav)
loop
for pokaz in (select * from pokaz)
loop
for group_level in (select * from group_level)
loop
p_sql := '
insert into from_cost_lab_with_love
with cte as (
select
' || pokaz.i_id_pokaz || ' as i_id_pokaz,
' || pokaz.pokaz_measure || ' as pokaz_measure,
' || pokaz.pokaz_describe || ' as "Описание показателя",
' || naprav.naprav_name || ' as "Блок данных",
' || group_level.level_name || ' as level_name,
' || group_level.tb_id || ' as tb_id,
' || group_level.gosb_id || ' as gosb_id,
' || group_level.org_id || ' as org_id,
' || pokaz.pokaz_formula || ' over(' || group_level.partition_column || ') as fact_amt,' --показатель
|| pokaz.pokaz_formula || ' over(' || group_level.partition_column || ') as fc_amt_1,
row_number() over(' || group_level.partition_column || ' order by BE) as rnk
0 as plan_amt,
TO_DATE(CONCAT(CONCAT(FINANSOVYJ_GOD,CONCAT(''0'',KVARTAL*3 - 3)),''01''), ''yyyymmdd'') as period_begin, --начало квартала
LAST_DAY(TO_DATE(CONCAT(CONCAT(FINANSOVYJ_GOD,CONCAT(''0'',KVARTAL*3)),''01''), ''yyyymmdd'')) as period_end, --конец квартала
LAST_DAY(TO_DATE(CONCAT(CONCAT(FINANSOVYJ_GOD,CONCAT(''0'',MESJATS)), ''01''), ''yyyymmdd'')) as rep_date, --дата измерений
TO_DATE(CURRENT_DATE, ''dd.mm.yy'') as load_date,
0 as execution
from erp_trips
)
select *
from cte
where rnk=1;';
dbms_output.put_line(p_sql);
execute immediate p_sql;
end loop;
end loop;
end loop;
end;
分号 (;
) 不是 SQL 语法的一部分 - 它是 SQL*Plus 等工具使用的终止符,表示输入结束, SQL 语句应该被执行。当您直接执行 SQL 语句时(例如,使用 execute immediate
),您不需要它(阅读:拥有它是错误的)。删除它,你应该没问题。
我收到一个错误
SQL command not properly ended
虽然 p_sql
变量包含有效的 SQL 查询,但无需执行和循环。
也许这是由于 execute immediate
declare
p_sql clob;
begin
for naprav in (select naprav_name from naprav)
loop
for pokaz in (select * from pokaz)
loop
for group_level in (select * from group_level)
loop
p_sql := '
insert into from_cost_lab_with_love
with cte as (
select
' || pokaz.i_id_pokaz || ' as i_id_pokaz,
' || pokaz.pokaz_measure || ' as pokaz_measure,
' || pokaz.pokaz_describe || ' as "Описание показателя",
' || naprav.naprav_name || ' as "Блок данных",
' || group_level.level_name || ' as level_name,
' || group_level.tb_id || ' as tb_id,
' || group_level.gosb_id || ' as gosb_id,
' || group_level.org_id || ' as org_id,
' || pokaz.pokaz_formula || ' over(' || group_level.partition_column || ') as fact_amt,' --показатель
|| pokaz.pokaz_formula || ' over(' || group_level.partition_column || ') as fc_amt_1,
row_number() over(' || group_level.partition_column || ' order by BE) as rnk
0 as plan_amt,
TO_DATE(CONCAT(CONCAT(FINANSOVYJ_GOD,CONCAT(''0'',KVARTAL*3 - 3)),''01''), ''yyyymmdd'') as period_begin, --начало квартала
LAST_DAY(TO_DATE(CONCAT(CONCAT(FINANSOVYJ_GOD,CONCAT(''0'',KVARTAL*3)),''01''), ''yyyymmdd'')) as period_end, --конец квартала
LAST_DAY(TO_DATE(CONCAT(CONCAT(FINANSOVYJ_GOD,CONCAT(''0'',MESJATS)), ''01''), ''yyyymmdd'')) as rep_date, --дата измерений
TO_DATE(CURRENT_DATE, ''dd.mm.yy'') as load_date,
0 as execution
from erp_trips
)
select *
from cte
where rnk=1;';
dbms_output.put_line(p_sql);
execute immediate p_sql;
end loop;
end loop;
end loop;
end;
分号 (;
) 不是 SQL 语法的一部分 - 它是 SQL*Plus 等工具使用的终止符,表示输入结束, SQL 语句应该被执行。当您直接执行 SQL 语句时(例如,使用 execute immediate
),您不需要它(阅读:拥有它是错误的)。删除它,你应该没问题。