Oracle在存储过程或函数中执⾏字符串sql
有时,我们需要在存储过程或函数中根据条件拼凑⼀些sql字符串语句,然后再执⾏拼凑后的sql字符串,如何做到呢?
参考以下代码:
FUNCTION CALCULATE_TARGET_SCORE (CUR_MONTH IN NVARCHAR2)
RETURN NCLOB
IS
PRAGMA AUTONOMOUS_TRANSACTION;
TVALUE_SQL VARCHAR2 (2000); --查询⽬标值的sql(不能把类型声明为NVARCHAR2)
RESULT_STR NCLOB;
KPI_VALUE NVARCHAR2 (200);
CUR_MONTH_BILL_ID NUMBER (19); --固话单ID
BEGIN
--获得当前固话单
SELECT MAX (ID)
INTO CUR_MONTH_BILL_ID
FROM GP_MONTH_BILL
WHERE MONTH= CUR_MONTH AND IS_USE =1;
--循环获得每个明细的完成值sql
IF CUR_MONTH_BILL_ID >0--区县指标
THEN
TVALUE_SQL :=
'SELECT TO_CHAR('
|| CUR_ROW.MAIN_FIELD
||') FROM '
|| CUR_ROW.END_TABLE
||'_'
|| CUR_MONTH
||' WHERE TO_CHAR(DISTRICT_ID)='''
|| CUR_ROW.E_DISTRICT_ID
||'''';
ELSE--客户经理指标
TVALUE_SQL :=
'SELECT TO_CHAR('
oracle手动调用存储过程
|| CUR_ROW.MAIN_FIELD
||') FROM '
|| CUR_ROW.END_TABLE
||'_'
|| CUR_MONTH
||' WHERE MANAGER_NO='''
|| CUR_ROW.MANAGER_NO
||'''';
END IF;
BEGIN
EXECUTE IMMEDIATE TVALUE_SQL INTO KPI_VALUE; --执⾏sql,得到完成值kpi_value
EXCEPTION
WHEN OTHERS
THEN
RESULT_STR :=
RESULT_STR
||'<br/> sql执⾏错误:'
|| TVALUE_SQL
||' INTO KPI_VALUE';
END;
--⼀些sql逻辑,含dml语句
COMMIT;
END;
关键语句:EXECUTE IMMEDIATE TVALUE_SQL INTO KPI_VALUE;
本项⽬涉及到的知识点:
1)在该⽰例中,需要把查询的值动态赋值给⼀个变量。注意变量的赋值不是在sql字符串中去拼凑,⽽是在执⾏sql字符串时在末尾加⼊ INTO VAL
2)如果要通过查询⽅式调⽤函数,同时函数中包含DML 语句时,在声明函数需要加⼊ PRAGMA AUTONOMOUS_TRANSACTION;
查询调⽤函数⽰例: SELECT YOUR_FUN() FROM DUAL;
3)如果函数声明中含有 PRAGMA AUTONOMOUS_TRANSACTION; 则在函数结尾加⼊commit 或 rollback
关联阅读:
关于EXECUTE IMMEDIATE的扩展阅读:
把⼀个查询结果集插⼊到临时表,需要⽤变量写法,参考如下:declare
l_sal pls_integer :=2000;
begin
execute immediate 'insert into temp(empno, ename) '||
' select empno, ename from emp '||
' where sal > :1'
using l_sal;
commit;
end;
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论