DBMS_SQL
DBMS_SQL包提供了一个接口,可以使用动态SQL通过PL/pgSQL解析任何数据操作语言(DML)或数据定义语言(DDL)语句。
数据类型
功能描述
在DBMS_SQL包中定义了一系列record类型、table类型的数据结构。如下数据结构方便在自定义函数或存储过程中进行变量的数据类型定义:
- Record类型有:desc_rec、desc_rec2、desc_rec3、desc_rec4。
- Table类型有:desc_tab、desc_tab2、desc_tab3、desc_tab4、number_table、varchar2_table、date_table、blob_table、clob_table、binary_double_table、binary_float_table。
- 常量类型:dbms_sql.native、dbms_sql.v6、dbms_sql.v7。
Record类型记录动态查询中单个列的详细信息,table类型是对应record类型的集合。通常同时搭配着DESCRIBE_COLUMNS等存储过程获取列信息。
desc_rec和desc_tab类型
功能描述
desc_rec记录类型保存动态查询中单个列的描述信息。desc_tab是一个表DESC_REC Record 类型。
该类型与DESCRIBE_COLUMNS存储过程搭配使用。
语法格式
desc_rec
TYPE desc_rec IS RECORD ( col_type BINARY_INTEGER := 0, col_max_len BINARY_INTEGER := 0, col_name VARCHAR2(32) := '', col_name_len BINARY_INTEGER := 0, col_schema_name VARCHAR2(32) := '', col_schema_name_len BINARY_INTEGER := 0, col_precision BINARY_INTEGER := 0, col_scale BINARY_INTEGER := 0, col_charsetid BINARY_INTEGER := 0, col_charsetform BINARY_INTEGER := 0, col_null_ok BOOLEAN := TRUE);
desc_tab
TYPE desc_tab IS TABLE OF desc_rec INDEX BY BINARY_INTEGER;
参数说明
col_type:动态查询中单个列数据类型对应的编号,编号如下:
Code Data Type 1 VARCHAR2(size [BYTE | CHAR]) 1 NVARCHAR2(size) 2 NUMBER [ (p [, s]) ] 2 FLOAT [(p)] 8 LONG 12 DATE 100 BINARY_FLOAT 101 BINARY_DOUBLE 180 TIMESTAMP [(fractional_seconds_precision)] 181 TIMESTAMP [(fractional_seconds_precision)] WITH TIME ZONE 231 TIMESTAMP [(fractional_seconds_precision)] WITH LOCAL TIME ZONE 182 INTERVAL YEAR [(year_precision)] TO MONTH 183 INTERVAL DAY [(day_precision)] TO SECOND [(fractional_seconds_precision)] 23 RAW(size) 24 LONG RAW 69 ROWID 208 UROWID [(size)] 96 CHAR [(size [BYTE | CHAR])] 96 NCHAR[(size)] 112 CLOB 112 NCLOB 113 BLOB 114 BFILE 119 JSON col_max_len:动态查询中单个列中数据类型长度。
col_name:动态查询中单个列名。
col_name_len:动态查询中单个列名字符长度。
col_schema_name:动态查询中单个列是自定义type类型返回自定义type所属的schema名,否则返回空。
col_schema_name_len:动态查询中单个列的数据类型所属schema名字长度。
col_precision:动态查询中单个列的数据类型精度,只有数字类型会存在精度,字符或时间等其他类型该值为0。
col_scale:动态查询中单个列的数据类型允许小数点后几位数。
col_charsetid:动态查询中单个列数据类型的字符集id,只有字符串类型存在字符集,其余数据类型字符集设置为0。目前只需要输出如下两种字符集类型即可:
字符集 字符集id GBK 852 UTF8 871 col_charsetform:动态查询中单个列数据类型的字符集,如果是字符串类型输出1,其余数据类型保持默认值0。
col_null_ok:动态查询中单个列的值是否为空。
desc_rec2和desc_tab2类型
功能描述
DESC_REC2是DESC_TAB2表类型和DESCRIBE_COLUMNS2存储过程的元素类型。
该类型与DESCRIBE_COLUMNS2存储过程搭配使用。
语法格式
desc_rec
TYPE desc_rec IS RECORD ( col_type BINARY_INTEGER := 0, col_max_len BINARY_INTEGER := 0, col_name varchar2(32767):= '', col_name_len BINARY_INTEGER := 0, col_schema_name VARCHAR2(32) := '', col_schema_name_len BINARY_INTEGER := 0, col_precision BINARY_INTEGER := 0, col_scale BINARY_INTEGER := 0, col_charsetid BINARY_INTEGER := 0, col_charsetform BINARY_INTEGER := 0, col_null_ok BOOLEAN := TRUE);
desc_tab2
TYPE desc_tab2 IS TABLE OF desc_rec2 INDEX BY BINARY_INTEGER;
desc_rec3和desc_ta3类型
功能描述
DESC_REC3是DESC_TAB3表类型和DESCRIBE_COLUMNS3存储过程的元素类型。
该类型与DESCRIBE_COLUMNS3存储过程搭配使用。
语法格式
desc_rec3
TYPE desc_rec3 IS RECORD ( col_type binary_integer := 0, col_max_len binary_integer := 0, col_name varchar2(32767) := '', col_name_len binary_integer := 0, col_schema_name varchar2(32) := '', col_schema_name_len binary_integer := 0, col_precision binary_integer := 0, col_scale binary_integer := 0, col_charsetid binary_integer := 0, col_charsetform binary_integer := 0, col_null_ok boolean := TRUE, col_type_name varchar2(32767) := '', col_type_name_len binary_integer := 0);
desc_rec3相比desc_rec2新增加了两个属性,分别是类型的名字和类型的长度。并且系统的数据类型不会进行填充,只有当是自定义type类型时候才会进行赋值。
desc_tab3
TYPE desc_tab3 IS TABLE OF desc_rec3 INDEX BY BINARY_INTEGER;
desc_rec4和desc_ta4类型
功能描述
DESC_REC4是DESC_TAB4表类型和DESCRIBE_COLUMNS4存储过程的元素类型。
该类型与DESCRIBE_COLUMNS4存储过程搭配使用。
语法格式
desc_rec4
TYPE desc_rec4 IS RECORD ( col_type binary_integer := 0, col_max_len binary_integer := 0, col_name varchar2(32767) := '', col_name_len binary_integer := 0, col_schema_name varchar2(32) := '', col_schema_name_len binary_integer := 0, col_precision binary_integer := 0, col_scale binary_integer := 0, col_charsetid binary_integer := 0, col_charsetform binary_integer := 0, col_null_ok boolean := TRUE, col_type_name varchar2(32767) := '', col_type_name_len binary_integer := 0);
desc_tab4
TYPE desc_tab4 IS TABLE OF desc_rec4 INDEX BY BINARY_INTEGER;
number_table、varcha2_table、date_table、blob_table、clob_table、binary_double_table、binary_float_table
功能描述
该类型与bind_array存储过程一起调用,该存储过程根据传入动态SQL进行table变量进行绑定作用。
语法格式
DBMS_SQL.BIND_ARRAY ( c IN INTEGER, name IN VARCHAR2, <table_variable> IN <datatype> [,index1 IN INTEGER, index2 IN INTEGER)] );
常量类型
常量 值 描述 dbms_sql.native 1 指定程序所连接的数据库的一般行为。 dbms_sql.v6 0 指定Oracle V6 版本的行为。 dbms_sql.v7 2 指定Oracle V7 版本的行为。 子程序
功能描述
DBMS_SQL主要功能是提供用于执行动态SQL(DML和DDL)的方法。该内置包包含以下函数:
函数 描述 OPEN_CURSOR 打开一个cursor,并返回该cursor的id。 CLOSE_CURSOR 用于关闭一个cursor。 COLUMN_VALUE 用于将fetch结果中的指定列保存到返回参数中。 DEFINE_COLUMN 用于定义返回的结果中的列结构。 EXECUTE 用于执行PARSE函数处理的SQL语句。 FETCH_ROWS 用于载入结果集中的一行结果。 PARSE 解析当前语句的语法。 RETURN_RESULT 用于将已执行语句的结果返回到客户端应用程序。 BIND_ARRAY 该存储过程根据传入动态SQL进行table变量进行绑定作用。 BIND_VARIABLE 该存储过程根据传入动态SQL进行变量的绑定。 DESCRIBE_COLUMNS
DESCRIBE_COLUMNS2
DESCRIBE_COLUMNS3该存储过程输出列的元数据信息。 DEFINE_ARRAY 定义要从给定游标中选择的集合,仅用于SELECT语句。 IS_OPEN 该函数用于判断游标是否打开。 FETCH_ROWS 该函数遍历DBMS_SQL.EXECUTE执行动态SQL返回结果数据集,DEFINE_COLUMN定义动态SQL返回的变量名、通过COLUMN_VALUE存储过程定义返回列的值。 注意事项
无。
兼容性
Vastbase G100 V2.2版本与Oracle 11g R2版本相比,不支持的函数有BIND_VARIABLE_PKG、COLUMN_VALUE_LONG、DEFINE_COLUMN_CHAR、DEFINE_COLUMN_LONG、DEFINE_COLUMN_RAW、DEFINE_COLUMN_ROWID、EXECUTE_AND_FETCH、GET_NEXT_RESULT、LAST_ERROR_POSITION、LAST_ROW_ID、LAST_SQL_FUNCTION_CODE、TO_CURSOR_NUMBER 、TO_REFCURSOR、VARIABLE_VALUE、VARIABLE_VALUE_PKG。
示例
1、创建测试表并插入数据。
create table dbms_t1(id number,con varchar(20)); insert into dbms_t1 values(1.5,'aaa'),(2.0,'bbb'),(3,'ccc');
2、创建存储过程调用函数。
CREATE OR REPLACE function dbms_demo1() return text AS cursor_name INT; rows_processed INT; ret INT; rec text; BEGIN cursor_name := DBMS_SQL.open_cursor(); DBMS_SQL.PARSE(cursor_name,'select con from public.dbms_t1;',0); ret := DBMS_SQL.EXECUTE(cursor_name); loop if DBMS_SQL.FETCH_ROWS(cursor_name) > 0 then select DBMS_SQL.COLUMN_VALUE(cursor_name,1,rec) into rec; else exit; end if; end loop; DBMS_SQL.CLOSE_CURSOR(cursor_name); return rec; END; /
3、调用存储过程dbms_demo1()。
select dbms_demo1();
当结果显示如下,则表示函数调用成功:
dbms_demo1 ------------ ccc (1 row)
4、创建测试表re_t1,re_t2并插入数据。
create table re_t1(c1 int,c2 varchar(32)); insert into re_t1 values(1,'111'); insert into re_t1 values(2,'222'); create table re_t2(c1 varchar(32),c2 int); insert into re_t2 values('111',1); insert into re_t2 values('222',2);
5、使用sys_refcursor类型作为输入。
create or replace procedure re_proc() as rc1 sys_refcursor; rc2 sys_refcursor; begin open rc1 for select * from re_t1; dbms_sql.return_result(rc1); open rc2 for select * from re_t2; dbms_sql.return_result(rc2); end; /
6、调用存储过程re_proc()。
call re_proc();
当返回结果如下,则表示函数调用成功:
ResultSet #1 c1 | c2 ----+----- 1 | 111 2 | 222 (2 rows) ResultSet #2 c1 | c2 -----+---- 111 | 1 222 | 2 (2 rows) re_proc --------- (1 row)
7、使用integer类型作为输入参数。
create or replace procedure re_proc_int() as id number; id1 number:=dbms_sql.open_cursor(); id2 number:=dbms_sql.open_cursor(); begin dbms_sql.parse(id1,'select * from public.re_t1',0); id:=dbms_sql.execute(id1); dbms_sql.return_result(id1); dbms_sql.parse(id2,'select * from public.re_t2',0); id:=dbms_sql.execute(id2); dbms_sql.return_result(id2); end; /
8、调用存储过程re_proc_int()。
call re_proc_int();
当结果返回如下,则表示调用成功:
ResultSet #1 c1 | c2 ----+----- 1 | 111 2 | 222 (2 rows) ResultSet #2 c1 | c2 -----+---- 111 | 1 222 | 2 (2 rows) re_proc_int ------------- (1 row)
OPEN_CURSOR
语法格式
DBMS_SQL.OPEN_CURSOR ( c IN OUT INTEGER);
参数说明
c:需要打开的游标ID号。
CLOSE_CURSOR
语法格式
DBMS_SQL.CLOSE_CURSOR ( c IN OUT INTEGER);
参数说明
c:需要关闭的游标ID数。
COLUMN_VALUE
语法格式
DBMS_SQL.COLUMN_VALUE ( c IN INTEGER, position IN INTEGER, value OUT <datatype> [,actual_length OUT INTEGER]);
对于char和raw数据的变量,可以使用如下函数变体:
DBMS_SQL.COLUMN_VALUE_CHAR ( c IN INTEGER, position IN INTEGER, value OUT CHAR CHARACTER SET ANY_CS [,actual_length OUT INTEGER]); DBMS_SQL.COLUMN_VALUE_RAW ( c IN INTEGER, position IN INTEGER, value OUT RAW [,actual_length OUT INTEGER]);
参数说明
- c:游标ID号。
- position:光标中列的相对位置、语句中的第一列位置为1。
- value:返回指定列的值。支持的数据类型:NUMBER,TABLE,CHAR,RAW,CLOB,BLOB,TEXT。
其中TABLE类型包括:
- number_table:由binary_integer索引的数值类型表。
- varchar2_table:由binary_integer索引的varchar2(4000)类型表。
- date_table:由binary_integer索引的date类型表。
- blob_table:由binary_integer索引的BLOB类型表。
- clob_table:由binary_integer索引的CLOB类型表。
- binary_float_table:由binary_integer索引的binary_float类型表。
- binary_double_table:由binary_integer索引的binary_double类型表。
CHAR,RAW,CLOB,BLOB数据类型仅在数据库版本为V2.2 Build 10 (Patch No.17)及以上补丁版本支持。
CHAR,RAW类型的值需要调用特定的DBMS_SQL.COLUMN_VALUE_CHAR和DBMS_SQL.COLUMN_VALUE_RAW函数。
- actual_length:当指定列的数据类型为TEXT时,支持配置该选项。用于设置指定列的值截断之前的实际长度,当参数未指定时默认值为0。当前该选项仅语法支持,无实际作用。
DEFINE_COLUMN
语法格式
DBMS_SQL.DEFINE_COLUMN ( c IN INTEGER, position IN INTEGER, column IN <datatype> [column_size IN INTEGER]);
参数说明
- c:游标ID号。
- position:正在定义的行中列的相对位置,语句中第一列的位置为1。
- colum:列值。支持的数据类型:CHAR,VARCHAR,NUMBER,DATE(代表oradate类型),CLOB,BLOB。
DATE、CHAR 和 VARCHAR数据类型仅在数据库版本为V2.2 Build 10(Patch No.16) 及以上补丁版本支持。
CLOB,BLOB数据类型仅在数据库版本为V2.2 Build 10(Patch No.17)及以上补丁版本支持。
- column_size:当column类型为VARCHAR时,支持配置该选项,用来设置列值的最大预期大小(以字节为单位)。
示例
示例 1 DEFINE_COLUMN入参为date类型。
1、创建存储过程。
set serveroutput on; create or replace procedure proc_1196474() as cursorid int; v_id date; query varchar(2000); execute_ret int; define_column_ret int; begin drop table if exists pro_dbms_sql_all_tb1_02 ; create temp table pro_dbms_sql_all_tb1_02(a date ,b int); create index on pro_dbms_sql_all_tb1_02(a); insert into pro_dbms_sql_all_tb1_02 values('2022-01-01',3); insert into pro_dbms_sql_all_tb1_02 values('2022-01-02',2); drop table if exists pro_dbms_sql_all_tb1_03 ; create temp table pro_dbms_sql_all_tb1_03(a date ,b int); create index on pro_dbms_sql_all_tb1_03(a); insert into pro_dbms_sql_all_tb1_03 values('2022-01-03',1); query := 'select * from pro_dbms_sql_all_tb1_02 order by 2'; --打开游标 cursorid := dbms_sql.open_cursor(); --编译游标 dbms_sql.parse(cursorid, query, 1); --定义列 select dbms_sql.define_column(cursorid,1,a) from pro_dbms_sql_all_tb1_03 into define_column_ret; --执行 execute_ret := dbms_sql.execute(cursorid); dbms_sql.fetch_rows(cursorid); --获取值 dbms_sql.column_value(cursorid,1,v_id); --输出结果 dbms_output.put_line('id:'|| v_id ); --关闭游标 dbms_sql.close_cursor(cursorid); end; /
2、调用存储过程。
call proc_1196474();
返回结果为:
id:2022-01-02 00:00:00 proc_1196474 -------------- (1 row)
示例 2 DEFINE_COLUMN入参列值为CLOB类型。
1、创建测试表并插入数据。
CREATE TABLE tbl_01_dbms_sql(a INTEGER ,b CLOB); INSERT INTO tbl_01_dbms_sql VALUES(1,'123456ABCG'); INSERT INTO tbl_01_dbms_sql VALUES(2,'223456ABCG');
2、创建存储过程。
SET SERVEROUTPUT ON; CREATE OR REPLACE PROCEDURE proc_test_01() AS cursorid INTEGER; col1 INTEGER; col2 CLOB := 'tmp'; query VARCHAR(2000); ret INTEGER; BEGIN query := 'SELECT * FROM tbl_01_dbms_sql ORDER BY 1'; DBMS_OUTPUT.PUT_LINE('a: ' || col1 || ', b: ' || col2); --打开游标 cursorid := DBMS_SQL.OPEN_CURSOR(); --编译游标 DBMS_SQL.PARSE(cursorid, query, DBMS_SQL.NATIVE); --定义列 DBMS_SQL.DEFINE_COLUMN(cursorid,1,col1); DBMS_SQL.DEFINE_COLUMN(cursorid,2,col2); --执行 ret := DBMS_SQL.EXECUTE(cursorid); --循环获取值 IF ret >=0 THEN LOOP EXIT WHEN DBMS_SQL.FETCH_ROWS(cursorid) = 0; DBMS_SQL.COLUMN_VALUE(cursorid,1,col1); DBMS_SQL.COLUMN_VALUE(cursorid,2,col2); --输出结果 DBMS_OUTPUT.PUT_LINE('a: ' || col1 || ', b: ' || col2); END LOOP; END IF; --关闭游标 DBMS_SQL.CLOSE_CURSOR(cursorid); END; /
3、调用存储过程。
call proc_test_01();
返回结果为:
a: , b: tmp a: 1, b: 123456ABCG a: 2, b: 223456ABCG proc_test_01 -------------- (1 row)
EXECUTE
语法格式
DBMS_SQL.EXECUTE ( c IN INTEGER) RETURN INTEGER;
参数说明
c:游标ID号。
FETCH_ROWS
语法格式
DBMS_SQL.FETCH_ROWS ( c IN INTEGER) RETURN INTEGER;
参数说明
c:ID号。
PARSE
语法格式
DBMS_SQL.PARSE ( c IN INTEGER, statement IN VARCHAR2A, language_flag IN INTEGER) ; DBMS_SQL.PARSE ( c IN INTEGER, statement IN VARCHAR2s, language_flag IN INTEGER) ;
参数说明
c:要解析的语句的游标ID号。
statement:要解析的SQL语句。
lb:语句元素的下限。
ub:语句中元素的上限。
lfflg:如果设置为TRUN,则在连接的每个元素之后插入换行符。
language_flag:指定 SQL 语句的行为。
edition:指定在以下条件下运行语句的版本:
如果是NULL该语句将在当前版本中运行。
如果指定了有效容器,则通过NULL表示该语句将在目标容器的默认版本中运行。
给定用户和执行语句的版本,用户必须USE对该版本具有特权。
以下一般条件适用。字符串的内容作为 SQL 标识符处理;如果版本的实际名称中存在特殊字符或小写字符,则必须用双引号将字符串的其余部分括起来,如果不使用双引号,则内容将大写。
apply_crossedition_trigger:指定要应用于指定 SQL 的正向交叉版本触发器的非限定名称。
fire_apply_trigger:指示apply_crossedition_trigger的内容本身是要执行的,还是只能作为用于选择其他触发器的指南。
schema:指定解析不合格对象名称的架构。如果NULL,则当前架构是有效用户的架构。
container:要在其中运行的目标容器的名称。
注意事项
- dbms_sql.parse存储过程中,支持常量dbms_sql.native、dbms_sql.v7、dbms_sql.v6参数。
示例
parse函数标志位支持dbms_sql、dbms_sql.v6、dbms_sql.v7三种类型。
1、创建测试表。
drop table t_dbms_sql cascade; CREATE TABLE t_dbms_sql(c1 int,c2 varchar(200));
2、调用parse函数。
SET SERVEROUTPUT ON; DECLARE c integer; test_sql varchar2(200); BEGIN test_sql := 'INSERT INTO t_dbms_sql VALUES(1,''zhangsan'')'; c := dbms_sql.open_cursor; dbms_sql.parse(c,test_sql,dbms_sql.native); dbms_sql.parse(c,test_sql,dbms_sql.v6); dbms_sql.parse(c,test_sql,dbms_sql.v7); dbms_sql.parse(c,test_sql,0); dbms_sql.parse(c,test_sql,1); dbms_sql.parse(c,test_sql,2); END; /
RETURN_RESULT
语法格式
DBMS_SQL.RETURN_RESULT( rc IN OUT SYS_REFCURSOR, to_client IN BOOLEAN DEFAULT TRUE); DBMS_SQL.RETURN_RESULT( rc IN OUT INTEGER, to_client IN BOOLEAN DEFAULT TRUE);
参数说明
- rc:语句游标或引用游标。
- to_client:将语句结果返回(或不返回)给客户端。如果是FALSE,则将其返回给直接调用者。
BIND_ARRAY
语法格式
DBMS_SQL.BIND_ARRAY ( c IN INTEGER, name IN VARCHAR2, <table_variable> IN <datatype>);
参数说明
- c : 代表执行dbms_sql.open_cursor返回的变量。
- name:需要绑定的变量名。
- <table_variable>:在dbms_sql中定义的table类型的数据结构。
示例
将table类型数据绑定到变量中赋值(number_table、varchar2_table、date_table、blob_table、clob_table、binary_double_table、binary_float_table)。
1、创建测试表。
DROP TABLE t_dbms_sql CASCADE; CREATE TABLE t_dbms_sql( c_number number, c_varchar2 varchar2(1000), c_date date, c_clob clob, c_binary_float binary_float, c_binary_double binary_double, c_blob blob);
2、调用函数。
SET SERVEROUTPUT ON; CREATE OR REPLACE FUNCTION func_dbms_sql() RETURNS VOID AS $$ DECLARE --创建table类型参数 array_number dbms_sql.number_table; array_varchar2 dbms_sql.varchar2_table; array_date dbms_sql.date_table; array_blob dbms_sql.varchar2_table; array_clob dbms_sql.clob_table; array_binary_double dbms_sql.binary_double_table; array_binary_float dbms_sql.binary_float_table; c integer; test_sql varchar2(200); e number; BEGIN --为number类型嵌套表赋值数不一致 array_number(1) := 1; array_number(2) := 2.2; array_number(3) := 33.3; array_number(4) := 4; array_number(5) := 5.5; array_number(6) := 66.6; --为varchar2类型嵌套表赋值 array_varchar2(1) := 'test1'; array_varchar2(2) := 'test2'; array_varchar2(3) := 'test3'; array_varchar2(4) := 'test4'; array_varchar2(5) := 'test5'; array_varchar2(6) := 'test6'; --为date类型嵌套表赋值 array_date(1) := '2011-01-01 11:01:01'; array_date(2) := '2012-02-02 12:02:02'; array_date(3) := '2013-03-03 13:03:03'; array_date(4) := '2014-04-04 14:04:04'; array_date(5) := '2015-05-05 15:05:05'; array_date(6) := '2016-06-06 16:06:06'; --为blob类型嵌套表赋值 array_blob(1) := '10101010'; array_blob(2) := '101010101'; array_blob(3) := '1010101010'; array_blob(4) := '10101010101'; array_blob(5) := '101010101010'; array_blob(6) := '1010101010101'; --为clob类型嵌套表赋值 array_clob(1) := 'clob1'; array_clob(2) := 'clob2'; array_clob(3) := 'clob3'; array_clob(4) := 'clob4'; array_clob(5) := 'clob5'; array_clob(6) := 'clob6'; --为binary_float类型嵌套表赋值 array_binary_float(1) := '1.111'; array_binary_float(2) := '22.2'; array_binary_float(3) := '3.333333'; array_binary_float(4) := '44.4'; array_binary_float(5) := '5.555555'; array_binary_float(6) := '66666.66666'; --为binary_double类型嵌套表赋值 array_binary_double(1) := '1.111'; array_binary_double(2) := '22.2'; array_binary_double(3) := '3.333333'; array_binary_double(4) := '44.4'; array_binary_double(5) := '5.555555'; array_binary_double(6) := '66666.66666'; c := dbms_sql.open_cursor(); test_sql := 'INSERT INTO t_dbms_sql VALUES(:c_number,:c_varchar2,:c_date,:c_clob,:c_binary_float,:c_binary_double,:c_blob)'; dbms_sql.parse(c,test_sql,dbms_sql.native); --绑定变量 dbms_sql.bind_array(c,':c_number',array_number); dbms_sql.bind_array(c,':c_varchar2',array_varchar2); dbms_sql.bind_array(c,':c_date',array_date); dbms_sql.bind_array(c,':c_blob',array_blob); dbms_sql.bind_array(c,':c_clob',array_clob); dbms_sql.bind_array(c,':c_binary_float',array_binary_float); dbms_sql.bind_array(c,':c_binary_double',array_binary_double); e := dbms_sql.execute(c); DBMS_SQL.CLOSE_CURSOR(c); END; $$ LANGUAGE plpgsql; select func_dbms_sql();
3、查询表中的数据。
select * from t_dbms_sql;
BIND_VARIABLE
语法格式
DBMS_SQL.BIND_VARIABLE ( c IN INTEGER, name IN VARCHAR2, value IN <datatype>);
参数说明
- c : 代表执行dbms_sql.open_cursor返回的变量。
- name:需要绑定的变量名。
- <value>:常见的varchar2、number、date等数据类型值。
示例
bind_variable函数-将常量类型赋值给数值类型字段
1、创建测试表。
DROP TABLE t_dbms_sql CASCADE; CREATE TABLE t_dbms_sql( c_int2 int2, c_int4 int4, c_numeric numeric, c_number number, c_float4 float4, c_float8 float8, c_real real);
2、将常量类型赋值给数值类型字段。
SET SERVEROUTPUT ON; --value参数赋值为常量类型 DECLARE c number; c_number number; test_sql varchar2(100); e number; BEGIN c := dbms_sql.open_cursor(); test_sql := 'INSERT INTO t_dbms_sql VALUES(:c_int2,:c_int4,:c_numeric,:c_number,:c_float4,:c_float8,:c_real)'; dbms_sql.parse(c,test_sql,dbms_sql.native); --绑定变量 dbms_sql.bind_variable(c,':c_int2',dbms_sql.native); dbms_sql.bind_variable(c,':c_int4',dbms_sql.v6); dbms_sql.bind_variable(c,':c_numeric',dbms_sql.v7); dbms_sql.bind_variable(c,':c_number',dbms_sql.native); dbms_sql.bind_variable(c,':c_float4',dbms_sql.v6); dbms_sql.bind_variable(c,':c_float8',dbms_sql.v7); dbms_sql.bind_variable(c,':c_real',dbms_sql.native); e := dbms_sql.execute(c); dbms_sql.close_cursor(c); END; /
3、查询表中数据。
select * from t_dbms_sql;
返回结果为:
c_int2 | c_int4 | c_numeric | c_number | c_float4 | c_float8 | c_real --------+--------+-----------+----------+----------+----------+-------- 1 | 0 | 2 | 1 | 0 | 2 | 1 (1 row)
DESCRIBE_COLUMNS,DESCRIBE_COLUMNS2,DESCRIBE_COLUMNS3
语法格式
DBMS_SQL.DESCRIBE_COLUMNS ( c IN INTEGER, col_cnt OUT INTEGER, desc_t OUT DESC_TAB); DBMS_SQL.DESCRIBE_COLUMNS2 ( c IN INTEGER, col_cnt OUT INTEGER, desc_t OUT DESC_TAB2); DBMS_SQL.DESCRIBE_COLUMNS3 ( c IN INTEGER, col_cnt OUT INTEGER, desc_t OUT DESC_TAB3); DBMS_SQL.DESCRIBE_COLUMNS3 ( c IN INTEGER, col_cnt OUT INTEGER, desc_t OUT DESC_TAB4);
参数说明
- c : 代表执行dbms_sql.open_cursor返回的变量。
- name:查询语句返回的列数量。
- desc_t:输出表的元数据信息,参考desc_tab的table变量。
DEFINE_ARRAY
语法格式
DEFINE_ARRAY ( c IN INTEGER, position IN INTEGER, <table_variable> IN <datatype> cnt IN INTEGER, lower_bnd IN INTEGER);
参数说明
- c:已经打开的cursor名称。
- position:指需要返回的字段在查询结果中处于第几列。
- <table_variable>:接收返回结果需要的变量,与define_column不同的是此变量是table,而不是普通的字段类型。
- cnt:表示一次可以返回的行数。
- lower_bnd:指n_tab的index从哪个数值开始,此数值是递增的.在此例中index是从1开始的,一次得到9行结果集,则有n_tab(1)到n_tab(9),如果循环再得到新的结果集,则index继续增长。
IS_OPEN
语法格式
DBMS_SQL.IS_OPEN (c IN INTEGER) RETURN BOOLEAN;
参数说明
c : 代表执行dbms_sql.open_cursor返回的变量。
示例
判断游标是否已打开,已打开判断为true,未打开判断为false
1、定义存储过程。
SET SERVEROUTPUT ON; CREATE OR REPLACE PROCEDURE proc_dbms_sql(i integer) as DECLARE c integer; BEGIN IF i<3 THEN c := dbms_sql.open_cursor(); raise notice '游标状态 is 打开 %',dbms_sql.is_open(c) ; ELSE raise notice '游标状态 is 关闭 %',dbms_sql.is_open(c) ; END IF; END; /
2、调用is_open函数。
DECLARE c integer; BEGIN --打开游标,判断为true PERFORM proc_dbms_sql(2); --未打开游标,判断为flase PERFORM proc_dbms_sql(3); END; /
返回结果为:
NOTICE: 游标状态 is 打开 t CONTEXT: referenced column: proc_dbms_sql SQL statement "SELECT proc_dbms_sql(2)" PL/pgSQL function inline_code_block line 5 at PERFORM NOTICE: 游标状态 is 关闭 f CONTEXT: referenced column: proc_dbms_sql SQL statement "SELECT proc_dbms_sql(3)" PL/pgSQL function inline_code_block line 7 at PERFORM ANONYMOUS BLOCK EXECUTE