oracle存储过程学习经典[语法+实例+调用]
oracle存储过程编写与调用

oracle存储过程编写与调用Oracle存储过程是一组预编译SQL语句的集合,其被存储在数据库中并可以重复使用。
它们被用来执行一系列的数据库操作,并可以接受参数作为输入,并返回结果。
编写和调用Oracle存储过程可以提高应用程序的性能和安全性。
以下是关于如何编写和调用Oracle存储过程的参考内容。
编写Oracle存储过程:1. 创建存储过程:使用CREATE PROCEDURE语句来创建一个新的存储过程。
例如:```sqlCREATE OR REPLACE PROCEDURE sp_exampleISBEGIN-- code goes hereEND;/```存储过程名称为"sp_example"。
2. 添加参数:存储过程可以接受输入参数和返回参数。
使用IN关键字来指定输入参数,使用OUT关键字来指定返回参数。
例如:```sqlCREATE OR REPLACE PROCEDURE sp_example(in_paramIN VARCHAR2, out_param OUT NUMBER)ISBEGIN-- code goes hereEND;/```3. 执行SQL语句:在存储过程中,可以执行各种SQL语句,包括SELECT、INSERT、UPDATE等。
例如:```sqlCREATE OR REPLACE PROCEDURE sp_exampleISBEGINSELECT * FROM employees;INSERT INTO departments VALUES (10, 'IT');UPDATE employees SET salary = salary * 1.1;END;/```调用Oracle存储过程:1. 调用存储过程:使用EXECUTE或EXEC关键字来调用存储过程。
例如: ```sqlEXEC sp_example;EXECUTE sp_example;```2. 传递参数:如果存储过程接受参数,则需要在调用时提供参数的值。
oracle存储过程学习经典语法实例调用

O r a c l e存储过程学习目录Oracle存储过程基础知识商业规则和业务逻辑可以通过程序存储在Oracle中,这个程序就是存储过程。
存储过程是SQL, PL/SQL, Java 语句的组合,它使你能将执行商业规则的代码从你的应用程序中移动到数据库。
这样的结果就是,代码存储一次但是能够被多个程序使用。
要创建一个过程对象 procedural object ,必须有 CREATE PROCEDURE 系统权限。
如果这个过程对象需要被其他的用户schema 使用,那么你必须有 CREATE ANY PROCEDURE 权限。
执行procedure 的时候,可能需要excute权限。
或者EXCUTE ANY PROCEDURE 权限。
如果单独赋予权限,如下例所示:grant execute on MY_PROCEDURE to Jelly调用一个存储过程的例子:execute MY_PROCEDURE 'ONE PARAMETER' ;存储过程 PROCEDURE 和函数 FUNCTION 的区别。
function有返回值,并且可以直接在Query中引用function和或者使用function的返回值。
本质上没有区别,都是 PL/SQL 程序,都可以有返回值。
最根本的区别是:存储过程是命令, 而函数是表达式的一部分。
比如:select max NAME FROM但是不能 exec max NAME 如果此时max是函数。
PACKAGE是function,procedure,variables 和sql 语句的组合。
package允许多个procedure使用同一个变量和游标。
创建 procedure的语法:Sql 代码:可以使用 create or replace procedure 语句, 这个语句的用处在于,你之前赋予的excute 权限都将被保留。
IN, OUT, IN OUT用来修饰参数。
oracle时间循环的存储过程范例

oracle时间循环的存储过程范例Oracle是一种关系型数据库管理系统,它提供了丰富的功能和工具来处理和管理数据。
在Oracle中,存储过程是一种由SQL语句和PL/SQL代码组成的数据库对象,可以被存储在数据库中并在需要的时候被调用执行。
本文将以Oracle时间循环的存储过程为范例,介绍如何使用存储过程来处理时间循环相关的操作。
在许多应用场景中,需要对一段连续的时间范围进行操作和处理。
例如,统计某个时间段内的销售额、计算某个时间段内的平均值等等。
这时,使用时间循环的存储过程可以简化代码的编写,并提高程序的执行效率。
下面是一个示例的存储过程,用于计算某个时间段内的销售额:```sqlCREATE OR REPLACE PROCEDURE calculate_sales(start_date IN DATE,end_date IN DATE)IS-- 定义变量total_sales NUMBER := 0;current_date DATE := start_date;sales_amount NUMBER;BEGIN-- 循环计算销售额WHILE current_date <= end_dateLOOP-- 查询当天的销售额SELECT SUM(amount)INTO sales_amountFROM salesWHERE sales_date = current_date;-- 累加销售额total_sales := total_sales + sales_amount;-- 增加一天current_date := current_date + 1;END LOOP;-- 输出结果DBMS_OUTPUT.PUT_LINE('Total sales from ' || start_date || ' to ' || end_date || ' is ' || total_sales);END;/```以上存储过程接受两个日期参数,分别表示时间范围的起始日期和结束日期。
oracle 存储过程 的select for update用法

oracle 存储过程的select for update用法Oracle存储过程的SELECT FOR UPDATE用法Oracle是一款广泛使用的关系型数据库管理系统,在处理并发事务时,一种常见的需求是对某些数据进行锁定,确保其独占访问。
Oracle 提供了SELECT FOR UPDATE语句,用于在SELECT查询过程中锁定所选的行。
SELECT FOR UPDATE语句的基本语法如下:```sqlSELECT 列名 FROM 表名 WHERE 条件 FOR UPDATE;```在存储过程中使用SELECT FOR UPDATE时,可以在查询语句中加入FOR UPDATE子句,指定需要锁定的数据行,以确保其他事务不能修改或删除这些数据。
下面通过一个实例来演示Oracle存储过程中SELECT FOR UPDATE的用法。
1. 首先,我们创建一个名为employee的表,用于存储员工信息。
```sqlCREATE TABLE employee (id NUMBER PRIMARY KEY,name VARCHAR2(50),salary NUMBER,department VARCHAR2(50));```2. 接下来,我们向employee表插入一些样例数据。
```sqlINSERT INTO employee (id, name, salary, department)VALUES (1, 'John', 5000, 'IT');INSERT INTO employee (id, name, salary, department)VALUES (2, 'Mary', 6000, 'Sales');COMMIT;```3. 现在,我们创建一个存储过程,演示SELECT FOR UPDATE的用法。
该存储过程用于查询指定员工的信息,并锁定该行数据,防止其他事务对其进行修改。
Oracle存储过程--游标循环调用函数存储过程

Oracle存储过程--游标循环调⽤函数存储过程存储过程的基本语法如下:create or replace procedure procedure_nameasbeginextention;end;在sqlplus中调⽤存储过程的⽅式:beginprocedure_name;end;我的业务需求是:查询⾃2015年1⽉1号以来的,每天的总订单量(截⽌到当天的所有订单),我需要接收⼀个时间,使订单时间⼩于等于该时间,然后对订单数计数,⼤概就是这样;这是⼀个需要运⾏的存储过程:CREATE OR REPLACEprocedure "RECYCLE_EVERY_DAY"ISbegindeclare--定义⼀个游标变量 ,将参数集合存进游标中cursor every_day_list isSELECTTO_DATE( '2015-01-01', 'yyyy-MM-dd' ) + ROWNUM - 1 AS daylistFROMDUAL CONNECT BY ROWNUM <= trunc(SYSDATE - to_date( '2015-01-01', 'yyyy-MM-dd' )) + 1 ;--这个SQL是求出2015年1⽉1号⾄今为⽌的每⼀天的⼀个时间结果集begin--循环游标,取出游标中的每⼀个值,然后将值传⼊到你需要的地⽅,⽐如另外⼀个存储过程for item in every_day_list LOOP-- DBMS_OUTPUT.PUT_LINE(item.daylist); --打印出游标中的每⼀项ADD_DATE_TEST(item.daylist);--ADD_DATE_TEST(item.daylist)是我的另外⼀个存储过程end loop;end;end RECYCLE_EVERY_DAY;下⾯是我的需要参数的存储过程:CREATE OR REPLACEPROCEDURE "ADD_DATE_TEST"(VS_DATE IN DATE) ISBEGINDECLARE cursorORDER_TYPE_LIST is --声明游标,将查询结果集存⼊游标SELECT DISTINCTto_char( VS_DATE, 'yyyy' ) AS year,CUSTOMER_TYPE,COUNT(*) AS ORDER_NUMS,SUM(COUNT(*)) over() AS ALL_ORDERSFROMT_ORDER_LISTWHERETO_CHAR(join_time,'yyyy-MM-dd') <= TO_CHAR(VS_DATE,'yyyy-MM-dd')GROUP BY to_char( VS_DATE, 'yyyy' ), CUSTOMER_TYPE ;beginFOR Itme in ORDER_TYPE_LIST LOOP --循环取出插⼊到相应的表insert into ZT_FWDX_TB_NUMTONGBI_XRD (ID,YEAR,CUSTOMER_TYPE,ORDER_NUMS,SUM_NUM,CREATE_TIME,IS_HISTORY,DATE_MONTH,DATE_DAY)values(SEQ_ZT_FWDX_NUMTONGBI_XRD.Nextval,Itme.year,Itme.KEHU_TYPE,Itme.ORDER_NUMS,Itme.ALL_ORDERS,VS_DATE,0,TO_CHAR(VS_DATE,'MM'),TO_CHAR(VS_DATE,'dd')); end loop;/*dbms_output.put_line(VS_DATE);*/--可以先试着打印出传⼊的参数,看是否是需要的参数end;COMMIT;--提交事务END ADD_DATE_TEST;⾥⾯的表和字段,可以换成⾃⼰需要的,忽略我⾃⼰的表信息;希望对你有帮助,有问题留⾔讨论!。
Oracle存储过程语法学习(Procedure+实例)

存储过程创建语法:(1)无参create or replace procedure 存储过程名as变量1 类型(值范围);变量2 类型(值范围);Begin........................Exception........................End;(2)带参create or replace procedure 存储过程名(param1 in type,param2 out type)as变量1 类型(值范围);变量2 类型(值范围);BeginSelect count(*) into 变量1 from 表A where列名=param1;If (判断条件) thenSelect 列名into 变量2 from 表A where列名=param1;Dbms_output.Put_line(‘打印信息’);Elseif (判断条件) thenDbms_output.Put_line(‘打印信息’);ElseRaise 异常名(NO_DATA_FOUND);End if;ExceptionWhen others thenRollback;End;注意事项:1,存储过程参数不带取值范围,in表示传入,out表示输出2,变量带取值范围,后面接分号3,在判断语句前最好先用count(*)函数判断是否存在该条操作记录4,用select 。
into。
给变量赋值5,在代码中抛异常用raise+异常名以命名的异常命名的系统异常产生原因ACCESS_INTO_NULL 未定义对象CASE_NOT_FOUND CASE 中若未包含相应的WHEN ,并且没有设置ELSE 时COLLECTION_IS_NULL 集合元素未初始化CURSER_ALREADY_OPEN 游标已经打开DUP_VAL_ON_INDEX 唯一索引对应的列上有重复的值INVALID_CURSOR 在不合法的游标上进行操作INVALID_NUMBER 内嵌的SQL 语句不能将字符转换为数字NO_DATA_FOUND 使用select into 未返回行,或应用索引表未初始化的TOO_MANY_ROWS 执行select into 时,结果集超过一行ZERO_DIVIDE 除数为0SUBSCRIPT_BEYOND_COUNT 元素下标超过嵌套表或VARRAY 的最大值SUBSCRIPT_OUTSIDE_LIMIT 使用嵌套表或VARRAY 时,将下标指定为负数VALUE_ERROR 赋值时,变量长度不足以容纳实际数据LOGIN_DENIED PL/SQL 应用程序连接到oracle 数据库时,提供了不正确的用户名或密码NOT_LOGGED_ON PL/SQL 应用程序在没有连接oralce 数据库的情况下访问数据PROGRAM_ERROR PL/SQL 内部问题,可能需要重装数据字典&pl./SQL 系统包ROWTYPE_MISMATCH 宿主游标变量与PL/SQL 游标变量的返回类型不兼容SELF_IS_NULL 使用对象类型时,在null 对象上调用对象方法STORAGE_ERROR 运行PL/SQL 时,超出内存空间SYS_INVALID_ID 无效的ROWID 字符串TIMEOUT_ON_RESOURCE Oracle 在等待资源时超时例子:1 create or replace procedure runbyparmeters (isal in emp.sal%type,sname out varchar,sjob in out varchar)2 as icount number;3 begin4 select count(*) into icount from emp where sal>isal and job=sjob;5 if icount=1 then6 ....9 else10 ....12 end if;13 exception14 when too_many_rows then15 DBMS_OUTPUT.PUT_LINE('返回值多于1行');16 when others then17 DBMS_OUTPUT.PUT_LINE('在RUNBYPARMETERS过程中出错!');18 end;过程调用方式一1 declare2 realsal emp.sal%type;3 realname varchar(40);4 realjob varchar(40);5 begin6 realsal:=1100;7 realname:='';8 realjob:='CLERK';9 runbyparmeters(realsal,realname,realjob); --必须按顺序10 DBMS_OUTPUT.PUT_LINE(REALNAME||' '||REALJOB);11 END;12方式二1 declare2 realsal emp.sal%type;3 realname varchar(40);4 realjob varchar(40);5 begin6 realsal:=1100;7 realname:='';8 realjob:='CLERK';9 runbyparmeters(sname=>realname,isal=>realsal,sjob=>realjob); --指定值对应变量顺序可变10 DBMS_OUTPUT.PUT_LINE(REALNAME||' '||REALJOB);11 END;说明:(1)使用%TYPE在许多情况下,PL/SQL变量可以用来存储在数据库表中的数据。
oracle 存储过程优秀例子

oracle 存储过程优秀例子Oracle存储过程是一种在数据库中存储和执行SQL语句的过程。
它可以接受参数并返回结果,用于实现复杂的业务逻辑和数据操作。
下面是10个优秀的Oracle存储过程示例,展示了不同方面的功能和用法。
1. 创建表并插入数据```sqlCREATE PROCEDURE create_employee_table ASBEGINEXECUTE IMMEDIATE 'CREATE TABLE employee (id NUMBER, name VARCHAR2(100))';EXECUTE IMMEDIATE 'INSERT INTO employee VALUES (1, ''John Doe'')';EXECUTE IMMEDIATE 'INSERT INTO employee VALUES (2, ''Jane Smith'')';END;```这个存储过程创建了一个名为employee的表,并插入了两条数据。
2. 更新员工姓名```sqlCREATE PROCEDURE update_employee_name(p_id NUMBER,p_name VARCHAR2) ASBEGINUPDATE employee SET name = p_name WHERE id = p_id;COMMIT;END;```这个存储过程接受员工的ID和新的姓名作为参数,然后更新对应员工的姓名。
3. 删除员工记录```sqlCREATE PROCEDURE delete_employee(p_id NUMBER) AS BEGINDELETE FROM employee WHERE id = p_id;COMMIT;END;```这个存储过程接受员工的ID作为参数,然后删除对应的员工记录。
oracle存储过程语法全解

存储过程1 CREATE OR REPLACE PROCEDURE 存储过程名2 IS3 BEGIN4 NULL;5 END;行1:CREATE OR REPLACE PROCEDURE 是一个SQL语句通知Oracle数据库去创建一个叫做skeleton存储过程, 如果存在就覆盖它;行2:IS关键词表明后面将跟随一个PL/SQL体。
行3:BEGIN关键词表明PL/SQL体的开始。
行4:NULL PL/SQL语句表明什么事都不做,这句不能删去,因为PL/SQL体中至少需要有一句;行5:END关键词表明PL/SQL体的结束存储过程创建语法:create or replace procedure 存储过程名(param1 in type,param2 out type)as变量1 类型(值范围); --vs_msg VARCHAR2(4000);变量2 类型(值范围);BeginSelect count(*) into 变量1 from 表A where列名=param1;If (判断条件) thenSelect 列名into 变量2 from 表A where列名=param1;Dbms_output。
Put_line(‘打印信息’);Elsif (判断条件) thenDbms_output。
Put_line(‘打印信息’);ElseRaise 异常名(NO_DATA_FOUND);End if;ExceptionWhen others thenRollback;End;注意事项:1,存储过程参数不带取值范围,in表示传入,out表示输出类型可以使用任意Oracle中的合法类型。
2,变量带取值范围,后面接分号3,在判断语句前最好先用count(*)函数判断是否存在该条操作记录4,用select 。
into。
给变量赋值5,在代码中抛异常用 raise+异常名CREATE OR REPLACE PROCEDURE存储过程名(--定义参数is_ym IN CHAR(6) ,the_count OUT NUMBER,)AS--定义变量vs_msg VARCHAR2(4000); --错误信息变量vs_ym_beg CHAR(6); --起始月份vs_ym_end CHAR(6); --终止月份vs_ym_sn_beg CHAR(6); --同期起始月份vs_ym_sn_end CHAR(6); --同期终止月份--定义游标(简单的说就是一个可以遍历的结果集)CURSOR cur_1 ISSELECT 。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Oracl e 存储过程学习目录Oracle 存储过程 (1)Oracle存储过程基础知识 (1)Oracle存储过程的基本语法 (2)关于Oracle存储过程的若干问题备忘 (4)1. 在Oracle中,数据表别名不能加as。
(4)2. 在存储过程中,select某一字段时,后面必须紧跟into,如果select整个记录,利用游标的话就另当别论了。
(5)3. 在利用select...into...语法时,必须先确保数据库中有该条记录,否则会报出"no datafound"异常。
(5)4. 在存储过程中,别名不能和字段名称相同,否则虽然编译可以通过,但在运行阶段会报错 (5)5. 在存储过程中,关于出现null的问题 (5)6. Hibernate调用Oracle存储过程 (6)用Java调用Oracle存储过程总结 (6)一、无返回值的存储过程 (6)二、有返回值的存储过程(非列表) (8)三、返回列表 (9)在存储过程中做简单动态查询 (11)一、本地动态SQL (12)二、使用DBMS_SQL包 (13)Oracle存储过程调用Java方法 (16)Oracle高效分页存储过程实例 (17)Oracle存储过程基础知识商业规则和业务逻辑可以通过程序存储在Oracle中,这个程序就是存储过程。
存储过程是SQL, PL/SQL, Java 语句的组合,它使你能将执行商业规则的代码从你的应用程序中移动到数据库。
这样的结果就是,代码存储一次但是能够被多个程序使用。
要创建一个过程对象(procedural object),必须有CREATE PROCEDURE 系统权限。
如果这个过程对象需要被其他的用户schema 使用,那么你必须有CREATE ANY PROCEDURE 权限。
执行procedure 的时候,可能需要excute权限。
或者EXCUTE ANY PROCEDURE 权限。
如果单独赋予权限,如下例所示:grant execute on MY_PROCEDURE to Jelly调用一个存储过程的例子:execute MY_PROCEDURE( 'ONE PARAMETER');存储过程(PROCEDURE)和函数(FUNCTION)的区别。
function有返回值,并且可以直接在Query中引用function和或者使用function的返回值。
本质上没有区别,都是PL/SQL 程序,都可以有返回值。
最根本的区别是:存储过程是命令, 而函数是表达式的一部分。
比如:select max(NAME) FROM但是不能exec max(NAME) 如果此时max是函数。
PACKAGE是function,procedure,variables 和sql 语句的组合。
package允许多个procedure使用同一个变量和游标。
创建procedure的语法:IN, OUT, IN OUT用来修饰参数。
IN 表示这个变量必须被调用者赋值然后传入到PROCEDURE进行处理。
OUT 表示PROCEDURE 通过这个变量将值传回给调用者。
IN OUT 则是这两种的组合。
authid代表两种权限:定义者权限(difiner right 默认),执行者权限(invoker right)。
定义者权限说明这个procedure中涉及的表,视图等对象所需要的权限只要定义者拥有权限的话就可以访问。
执行者权限则需要调用这个procedure的用户拥有相关表和对象的权限。
Oracle存储过程的基本语法将select查询的结果存入到变量中,可以同时将多个列存储多个变量中,必须有一条记录,否则抛出异常(如果没有记录抛出NO_DATA_FOUND)7.带参数的cursor8.用pl/sql developer debug连接数据库后建立一个Test WINDOW在窗口输入调用SP的代码,F9开始debug,CTRL+N单步调试9.Pl/Sql中执行存储过程注:在EXECUTE IMMEDIATE STR语句是SQLPLUS中动态执行语句,它在执行中会自动提交,类似于DP中FORMS_DDL语句,在此语句中str是不能换行的,只能通过连接字符"||",或着在在换行时加上"-"连接字符。
关于Oracle存储过程的若干问题备忘1.在Oracle中,数据表别名不能加as。
如:select a.appname from appinfo a;-- 正确select a.appname from appinfo as a;-- 错误也许,是怕和Oracle中的存储过程中的关键字as冲突的问题吧2.在存储过程中,select某一字段时,后面必须紧跟into,如果sel ect整个记录,利用游标的话就另当别论了。
select af.keynode into knfrom APPFOUNDATION afwhere af.appid=aid and af.foundationid=fid; -- 有into,正确编译select af.keynodefrom APPFOUNDATION afwhere af.appid=aid and af.foundationid=fid;-- 没有into,编译报错,提示:Compilation Error: PLS-00428: an INTO clause is expected in this SELECT statement3.在利用select...into...语法时,必须先确保数据库中有该条记录,否则会报出"no data found"异常。
可以在该语法之前,先利用select count(*) from 查看数据库中是否存在该记录,如果存在,再利用select...into...4.在存储过程中,别名不能和字段名称相同,否则虽然编译可以通过,但在运行阶段会报错select keynode into kn from APPFOUNDATION where appid=aid and foundationid=fid;-- 正确运行select af.keynode into kn from APPFOUNDATION af where af.appid=appid and af.foundationid =foundationid;-- 运行阶段报错,提示:ORA-01422:exact fetch returns more than requested number of rows5.在存储过程中,关于出现null的问题假设有一个表A,定义如下:create table A(id varchar2(50) primary key not null,vcount number(8) not null,bid varchar2(50) not null -- 外键);select sum(vcount) into fcount from A where bid='xxxxxx';如果A表中不存在bid="xxxxxx"的记录,则fcount=null(即使fcount定义时设置了默认值,如:fcount number(8):=0依然无效,fcount还是会变成null),这样以后使用fcount时就可能有问题,所以在这里最好先判断一下:if fcount is null thenfcount:=0;end if;这样就一切ok了。
6.Hibernate调用Oracle存储过程用Java调用Oracl e存储过程总结一、无返回值的存储过程例: 存储过程为(当然了,这就先要求要建张表TESTTB,里面两个字段(I_ID,I_NAME)。
二、有返回值的存储过程(非列表)例:存储过程为:注意,这里的proc.getString(2)中的数值2并非任意的,而是和存储过程中的out列对应的,如果out是在第一个位置,那就是proc.getString(1),如果是第三个位置,就是proc.getString(3),当然也可以同时有多个返回值,那就是再多加几个out参数了。
三、返回列表由于Oracle存储过程没有返回值,它的所有返回值都是通过out参数来替代的,列表同样也不例外,但由于是集合,所以不能用一般的参数,必须要用pagkage了.所以要分两部分,1.建一个程序包。
如下:2.在Java里调用时就用下面的代码:在这里要注意,在执行前一定要先把Oracle的驱动包放到class路径里,否则会报错的。
在存储过程中做简单动态查询在存储过程中做简单动态查询代码 ,例如:一般的PL/SQL程序设计中,在DML和事务控制的语句中可以直接使用SQL,但是DDL 语句及系统控制语句却不能在PL/SQL中直接使用,要想实现在PL/SQL中使用DDL语句及系统控制语句,可以通过使用动态SQL来实现。
首先我们应该了解什么是动态SQL,在Oracle数据库开发PL/SQL块中我们使用的SQL 分为:静态SQL语句和动态SQL语句。
所谓静态SQL指在PL/SQL块中使用的SQL语句在编译时是明确的,执行的是确定对象。
而动态SQL是指在PL/SQL块编译时SQL语句是不确定的,如根据用户输入的参数的不同而执行不同的操作。
编译程序对动态语句部分不进行处理,只是在程序运行时动态地创建语句、对语句进行语法分析并执行该语句。
Oracle中动态SQL可以通过本地动态SQL来执行,也可以通过DBMS_SQL包来执行。
下面就这两种情况分别进行说明:一、本地动态SQL本地动态SQL是使用EXECUTE IMMEDIATE语句来实现的。
1、本地动态SQL执行DDL语句:需求:根据用户输入的表名及字段名等参数动态建表。
到这里,就实现了我们的需求,使用本地动态SQL根据用户输入的表名及字段名、字段类型等参数来实现动态执行DDL语句。
2、本地动态SQL执行DML语句。
需求:将用户输入的值插入到上例中建好的dinya_test表中。
执行存储过程,插入数据到测试表中。
在上例中,本地动态SQL执行DML语句时使用了using子句,按顺序将输入的值绑定到变量,如果需要输出参数,可以在执行动态SQL的时候,使用RETURNING INTO 子句,如:二、使用DBMS_SQL包使用DBMS_SQL包实现动态SQL的步骤如下:A、先将要执行的SQL语句或一个语句块放到一个字符串变量中。
B、使用DBMS_SQL包的parse过程来分析该字符串。
C、使用DBMS_SQL包的bind_variable过程来绑定变量。