Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在字符串中插入动态SQL oracle变量?_Oracle - Fatal编程技术网

如何在字符串中插入动态SQL oracle变量?

如何在字符串中插入动态SQL oracle变量?,oracle,Oracle,我有一个动态查询: declare p_sql clob; begin ​for naprav in (select naprav_name from naprav) ​ ​ ​loop​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ for pokaz

我有一个动态查询:

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 || ' as fact_amt,' --показатель

​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ||​ pokaz.pokaz_formula || '  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 using group_level.partition_column;

​ ​ ​ ​ ​ ​ ​ ​end loop;

​ ​ ​ ​ ​end loop;

​ ​ ​end loop;

end;
它有一个字段pokaz。pokaz_公式,此字段取自pokaz表,此字段的值之一为pokaz。博卡苏公式:

sum(distinct RASHODY) over(:1)/count(distinct KOD_TSZ) over(:1)
dbms_输出:

insert into from_cost_lab_with_love

              with cte as (

                     select

                     '99business_trips_01' as i_id_pokaz,

                     'руб.' as pokaz_measure,

                     'Командировочные расходы, руб.' as "Описание показателя",

                     'Командировки' as "Блок данных",

                     'gosb' as level_name,

                     BE/100 as tb_id,

                     GOSB as gosb_id,

                     '' as org_id,

                     sum(distinct RASHODY) over(:1) as fact_amt,sum(distinct RASHODY) over(:1) as fc_amt_1,

                           row_number() over(partition by BE, GOSB 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 and gosb_id <> 'ПЦП'

              order by tb_id, gosb_id

当这个值在p_sql变量的循环中被替换时,值:1应该被group_level表列中的值替换,就像在我的代码中一样。但是编译器发誓缺少右括号,我如何解决这个问题?

正如不能绑定表名一样,也不能绑定分析函数的部分

示例-ORA-00903失败:表名无效

同样,对于试图通过子句绑定分区的用户也是有效的

正如您使用ORA-00907所观察到的那样:缺少右括号

您可以做但肯定不想做的是在partitionby子句中绑定一个值

这是可行的,但其行为方式与ommit partition by子句相同,因为它对应于partition by“col2”,即对固定值进行分区会导致表中所有行的一个分区

因此,您正在寻找的解决方案可能是将partition by子句连接到insert语句中:

 execute immediate 'insert into tab1(col) select max(col) over (' || 
    group_level.partition_column || /* concatenate the partition clause in the SQL */
 ')  from tab2';
这将产生类似的结果

insert into tab1(col) select max(col) over (partition by col2)  from tab2

在执行此操作时,您应该始终检查SQL注入。

运行代码时会出现什么错误?此外,您的SQL字符串不应具有;在最后使用executeimmediate时。尝试更改SQL字符串的结尾,其中rnk=1;对于其中的rnk=1。另外,您能否给出一个从DBMS_输出的输出的示例?@EJEgyed,“;”这不是一个问题,我忘了从那里删除它,它不在我的代码中。在绑定时,我为您添加了有问题的dbms输出:1,您的绑定是否实际具有按关键字划分的分区?或者它只是一个列名?是的,分区依据的是构造你想说我不能解决这个架构的问题吗?如果你给表结构提供一些示例数据和你期望的输出,我们可能能够帮助提供一个更有效的解决方案来查询/插入您正在查找的数据。@МаСаАбббббббббббproposal@MarmitBomber,但我有一个不同的公式作为例子:gosh的sumrashody超额分配和gosh的sumrashody超额分配/countnomer超额分配。我想把它存储在一个变量中,我通过添加公式1和公式2来解决这个问题:公式1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | 124。请注意,“| |”/”与第二个变体中的“/”不同,您会得到一个错误。当我不需要除法时,我在公式2中加上“countdistinct 1”
begin
 execute immediate 'insert into tab1(col) select max(col) over (partition by :1)  from tab2' using 'col2';
end;
/
 execute immediate 'insert into tab1(col) select max(col) over (' || 
    group_level.partition_column || /* concatenate the partition clause in the SQL */
 ')  from tab2';
insert into tab1(col) select max(col) over (partition by col2)  from tab2