oracle的存储过程里怎样调用动态变量

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了oracle的存储过程里怎样调用动态变量相关的知识,希望对你有一定的参考价值。

create or replace procedure SYSRINGALL_TEST is
all_tmp_name char(30);
all_name char(30);
begin

if all_tmp_name is null then
select 'ring_all_old_'||to_char(sysdate,'yyyymm')||'_tmp' into all_tmp_name from dual;
end if;

if all_name is null then
select 'ring_all_old_'||to_char(sysdate,'yyyymm') into all_name from dual;
end if;

------由ALL进TMP---------
insert into all_tmp_name

select * from all_name;

commit;
end SYSRINGALL_TEST;

==========================
其实就是想动态生成ring_all_old_200606和ring_all_old_200606_tmp
这两个表名让下面使用
但老是编译出错,如果把下面改成
insert into ring_all_old_200606_tmp

select * from ring_all_old_200606;
就能编译通过.
请问该怎样改啊?
来看我来错地方啦~~~baidu里面都是娱乐为主的!!!

实现思路:

第一步:先定义一个字符串,这个字符串SQL是由动态变量和其他的sql语句成分拼接组成。

第二步:直接执行 execute immediate SQL;

备注:以上方法是oracle提供的动态执行方法语句,直接使用就可以。

 VAR_DYNAMIC_SQL := 'INSERT INTO RP_COMFIRMED_EVENT_DETAIL(
        EVENT_ID,--ID
        TRANS_TIME,--交易时间
        TRANS_TYPE,--交易类型
        TRANS_PROVINCE,--开户省份
        CCE_CSTNO,--客户号
        CCE_CERTTYPE,--证件类型
        CCE_CERTNO,--证件号
        CCE_AMT,--交易金额
        CCE_RISK_SCORE,--不处理的风险分值
        CCE_PAYEE_ACC,--付款人账号
        CCE_PAYEE_NAME,--付款人姓名
        CCE_REC_NODE,--收款人开户行
        CCE_REC_ACC,--收款人账号
        CCE_REC_NAME,--收款人姓名
        RULE_NAME,--规则名称
        CCE_RULE_NOTE,--规则描述
        SCORE_RANGE--处理后的风险分值
      )select
       EVENT_ID,
       SYS_CREATION_DATE,
       GET_NAME_BY_CODE(GET_TOTAL_EVENT_TYPE(T1.EVENT_TYPE,T1.USER_DEFINED_EVENT_TYPE),''eventType'') AS TRANS_TYPE,
      -- get_province(IP_COUNTRY,IP_CITY) AS CCE_TRANSTYPE,
       get_vale_from_cd_p('||get_vale_from_cd1('13','5')||'),--开户省份为自定义字段
       USER_ID,
       '||get_vale_from_cd1('4','4')||',--证件类型为自定义字段
       '||get_vale_from_cd1('7','4')||',--证件号为自定义字段  要转换成动态SQL
       GET_AMT_BY_CURRENCY(AMOUNT_ORIGINAL,AMOUNT_CURRENCY),--通过汇率和币种转换
       RISK_SCORE,
       USER_ACCT_NUMBER,
       '||get_vale_from_cd_g1(get_vale_from_cd_al)||',--付款人姓名
       '||get_vale_from_cd1('11','5')||',--收款人开户行 自定义字段 需转换成动态SQL
       EXT_ACCT_NUMBER,
       EXT_ACCT_OWNER_NAME,
       NVL(POLICY_RULE_ID,''FALLBACK_RULE'') AS RULE_NAME,
       SUBSTR(GET_RULE_ORDER_ID(ORG_ID,POLICY_RULE_ID),INSTR(GET_RULE_ORDER_ID(ORG_ID,POLICY_RULE_ID),''-'')+1),--描述
       GET_SCORE_RANGE(RISK_SCORE) AS RISK_SCORE_RANGE
       FROM EVENT_LOG_REALTIME T1
))';
       execute immediate VAR_DYNAMIC_SQL;

参考技术A create or replace procedure SYSRINGALL_TEST is
all_tmp_name char(30);
all_name char(30);
tmp_str varchar(2000);
begin

if all_tmp_name is null then
select 'ring_inkfish_'||to_char(sysdate,'yyyymm')||'_tmp' into all_tmp_name from dual;
end if;

if all_name is null then
select 'ring_inkfish_'||to_char(sysdate,'yyyymm') into all_name from dual;
end if;

tmp_str :='insert into '||all_tmp_name||' select * from '||all_name;
execute immediate tmp_str;

commit;
end SYSRINGALL_TEST;
嘿嘿,不容易啊!!自己搞定啦!希望能对大家有帮助!本回答被提问者和网友采纳

oracle 如何终止存储过程的运行!

比如一个存储过程调用了5个子存储过程,第一个子存储过程执行报错后,如何终止所有存储过程的运行?因为现在情况是第一个错误报了ORA-00054错,但是除了错误的子存储过程其他都执行了。这样数据会很有问题。请问大大如何加判断直接终止整个存储过程的运行保证数据的一致。

select * from v$access a where object like '存储过程名%' --存储过程名为大写字母
select * from v$session where sid=74 --74为上一个查询得到的SID值,可能是多个,这里找到他们对应的serial#值
alter system kill session '74,118' --参数为'sid,serial#',用于停止这个回话,同时也终止了存储过程
参考技术A 如果觉得数据有问题,直接停止,输入rollback执行就可以,或者像楼上所说的捕获异常,去除每个存储过程中的commit,在所有的都执行OK后再commit 参考技术B 1. 在V$ACCESS视图中找到要停止进程的SID:
SELECT SID FROM V$ACCESS WHERE NAME='存储过程名称';
2. 在V$SESSION视图中查找到查出SID和SERIAL#
SELECT SID,SERIAL#,FROM V$SESSION WHERE SID='刚才查到的SID'。
3.杀掉查找出来的进程
alter system kill session 'SID,SERIAL#' immediate;
解释:进程都有唯一的进程id(SID)和序列号(SERIAL#),之后通过kill命令即可强制停止进程。
参考技术C 在外层的存储过程中捕获并处理异常

以上是关于oracle的存储过程里怎样调用动态变量的主要内容,如果未能解决你的问题,请参考以下文章

ORACLE存储过程里可以声明过程和函数吗

ORACLE存储过程怎么调用?

调用SQL的存储过程时怎样输入时间类型的参数

大家帮忙看看Oracle存储过程怎样给变量赋值

oracle在写存储过程时怎样将变量和字符串进行连接

怎样在sql语句中oracle调用存储过程