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('
|| 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(VAL1,VAL2...) FROM DUAL;
3)如果函数声明中含有 PRAGMA AUTONOMOUS_TRANSACTION; 则在函数结尾加入commit 或 rollback
关联阅读:ORA-14551: 无法在查询中执行 DML 操作
关于EXECUTE IMMEDIATE的扩展阅读:
execute immediate的简单用法(oracle)
把一个查询结果集插入到临时表,需要用变量写法,参考如下:
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;
Oracle 在存储过程或函数中执行字符串sql的更多相关文章
- oracle 在存储过程或函数中得到异常sql
BEGIN SQLSTR := 'UPDATE TBL ...'; EXECUTE IMMEDIATE SQLSTR; EXCEPTION WHEN OTHERS INSERT INTO LOG_TA ...
- 在Oracle中执行动态SQL的几种方法
转载:在Oracle中执行动态SQL的几种方法 以下为内容留存: 在Oracle中执行动态SQL的几种方法 在一般的sql操作中,sql语句基本上都是固定的,如:SELECT t.empno,t.en ...
- python json-json.loads()函数中的字符串需要是严格的json串格式,不能包含单引号
先看下json的dumps()和loads()函数的定义 json.dumps():将一个Python对象编码成JSON字符串.把字典对象转换成json串 json.loads():将JSON格式字符 ...
- 38 写一个函数,求一个字符串的长度,在main函数中输入字符串,并输出其长度。
题目:写一个函数,求一个字符串的长度,在main函数中输入字符串,并输出其长度. public class _038PrintLength { public static void main(Stri ...
- 写一个函数,求一个字符串的长度,在main函数中输入字符串,并输出其长度
import java.util.Scanner; /** * [程序38] * * 题目:写一个函数,求一个字符串的长度,在main函数中输入字符串,并输出其长度. * * @author Jame ...
- Django中执行原生SQL语句【新编辑】
参考我的个人博客 这部分迁移到了个人博客中:Django中执行原生SQL语句 这里需要补充一下,还有一个extra方法: ret = models.Student.objects.all().extr ...
- thinkPHP框架中执行原生SQL语句的方法
这篇文章主要介绍了thinkPHP框架中执行原生SQL语句的方法,结合实例形式分析了thinkPHP中执行原生SQL语句的相关操作技巧,并简单分析了query与execute方法的使用区别,需要的朋友 ...
- Java代码调用Oracle的存储过程,存储函数和包
Java代码调用存储过程和存储函数要使用CallableStatement接口 查看API文档: 上代码: java代码调用如下的存储过程和函数: 查询某个员工的姓名 月薪 职位 create or ...
- Oracle procedure存储过程/function函数
--函数的创建 create function func1(dno number) return NUMBER--必须带有返回值 is v_max number;--定义返回值 begin selec ...
随机推荐
- 微信小程序下拉框之二维数组或对象
在项目中,我们大多数时候传的值并不是需要这个下标,而是其他的值.像我项目中,需要获取到的是它对应的Id,那么我们如何通过它的这个下标值返回你想要的值呢? 通过picker返回的索引值,去获取匹配你想获 ...
- 【代码笔记】Web-HTML-框架
一,效果图. 二,代码. <!DOCTYPE html> <html> <head> <meta charset="utf-8"> ...
- 【工具相关】Web-ionic-ionicLab的使用
一,下载地址为:http://lab.ionic.io/,下载后直接安装即可.图标如下图所示: 二,打开ionicLab,如下图所示: 三,打开一个已有的文件,File-->Open Exist ...
- SEO高级技巧
原文地址:http://www.it28.cn/sousuoyinqing/853115.html 现在提起SEO来最少能让一部人感到痛苦,为什么呢,因为他们看不到希望,他们追求的永远是排名,其实SE ...
- mysql主从复制报错(一主一从):从库报错Last_SQL_Errno: 1008
配置完主从复制后(一主一从),在从库删了一个测试库,结果在从库上使用show slave status\G查看主从同步状态报如下错误:Last_Errno: 1008,经过排查得知:主从环境删除要先在 ...
- List基础操作
/** * List基础操作 * Created by zhen on 2018/11/14. */ object ListDemo { def main(args: Array[String]) { ...
- SQL SERVER利用BCP命令在命令行下导出数据到csv文件中
bcp "select * from (DBNAME).dbo.qt_trace where User_1 is not null" queryout c:\%date:~6,4% ...
- FUSE 用户空间文件系统 (Filesystem in Userspace)
FUSE 仓库 Wiki FUSE 性能评测 关于Fuse文件系统: FUSE (Filesystem in Userspace) is an interface for userspace prog ...
- 5.3Python函数(三)
目录 目录 前言 (一)装饰器 ==1.简单的装饰器== ==2.修饰带参数函数的装饰器== ==3.修饰带返回值函数的装饰器== ==4.自身带参数的装饰器== (二)迭代器 (三)生成器 ==1. ...
- Spring容器技术内幕之内部工作机制
引言 Spring容器就像一台构造精妙的机器,我们通过配置文件向机器传达控制信息,机器就能够按照设定的模式工作.如果将Spring容器比作一辆车,那么可以将BeanFactory看成汽车的发动机,而A ...