EXECUTE IMMEDIATE用法相关知识点
(2013-03-13 11:10:25)
标签:
executeimmediate动态sql绑定变量usingit |
分类: Oracle笔记 |
说明:
实例说明
1.2.1
DECLARE
BEGIN
END;
1.2.2
1.2.2.1不绑定输入变量
DECLARE
BEGIN
END;
1.2.2.2
DECLARE
v_sql VARCHAR2(1000);
v_table VARCHAR2(30) := 'test_ynamic_sql';
BEGIN
--1、绑定输入变量
v_sql := ' insert into ' || v_table || ' values (:1,:2)';
EXECUTE IMMEDIATE v_sql
USING '2', 'binding_in_variable'; --使用using绑定输入变量
END;
1.2.3 动态DML select
1.2.3.1
DECLARE
v_sql VARCHAR2(1000);
v_table VARCHAR2(30) := 'test_ynamic_sql';
--1、使用简单pl/sql变量v_id,v_name获得单行输出
v_id VARCHAR2(10);
v_name VARCHAR2(100);
--2、使用基于test_ynamic_sql表的记录变量获得单行输出
TYPE test_ynamic_sql_record IS RECORD(
v_id test_ynamic_sql.ID%TYPE,
v_name test_ynamic_sql.NAME%TYPE);
test_ynamic_sql_row test_ynamic_sql_record;
BEGIN
--1、使用简单pl/sql变量v_id,v_name获得单行输出
v_sql := ' select id,name from ' || v_table || ' where id=:1 ';
EXECUTE IMMEDIATE v_sql
INTO v_id, v_name
USING '1';
DBMS_OUTPUT.put_line('id=' || v_id || ',name=' || v_name);
--2、使用基于test_ynamic_sql表的记录变量获得单行输出
EXECUTE IMMEDIATE v_sql
INTO test_ynamic_sql_row
USING '1';
DBMS_OUTPUT.put_line('id=' || test_ynamic_sql_row.v_id || ',name=' ||
test_ynamic_sql_row.v_name);
END;
1.2.3.2
1.2.3.2.1
DECLARE
v_sql VARCHAR2(1000);
v_table VARCHAR2(30) := 'test_ynamic_sql';
--1、使用基于test_ynamic_sql表的记录变量获得多行输出
TYPE test_ynamic_sql_record IS RECORD(
id test_ynamic_sql.ID%TYPE,
NAME test_ynamic_sql.NAME%TYPE);
TYPE test_ynamic_sql_table_type IS TABLE OF test_ynamic_sql_record INDEX BY BINARY_INTEGER;
--TYPE test_ynamic_sql_table_type IS TABLE OF test_ynamic_sql%ROWTYPE INDEX BY BINARY_INTEGER;
test_ynamic_sql_multi_row test_ynamic_sql_table_type;
BEGIN
--1、使用基于test_ynamic_sql表的记录变量获得多行输出
v_sql := ' select id,name from ' || v_table;
EXECUTE IMMEDIATE v_sql BULK COLLECT
INTO test_ynamic_sql_multi_row;
FOR m IN 1 .. test_ynamic_sql_multi_row.COUNT LOOP
DBMS_OUTPUT.put_line('id=' || test_ynamic_sql_multi_row(m)
.id || ',name=' || test_ynamic_sql_multi_row(m).NAME);
END LOOP;
END;
1.2.3.2.2 - DECLARE
-
v_sql VARCHAR2(1000); -
'test_ynamic_sql';v_table VARCHAR2(30) := -
--1、使用基于多个嵌套表获取多行输出 -
ISTYPE test_ynamic_sql_id_type TABLE OF test_ynamic_sql.ID%TYPE INDEXBY BINARY_INTEGER; -
ISTYPE test_ynamic_sql_name_type TABLE OF test_ynamic_sql. NAME%TYPEINDEX BY BINARY_INTEGER; -
test_ynamic_sql_multi_row_id test_ynamic_sql_id_type; -
test_ynamic_sql_multi_row_name test_ynamic_sql_name_type; - BEGIN
-
--1、使用基于多个嵌套表获取多行输出 -
'v_sql := select id,name from ' || v_table; -
EXECUTEIMMEDIATE v_sql BULK COLLECT -
INTOtest_ynamic_sql_multi_row_id, test_ynamic_sql_multi_row_name; -
FORm IN1 COUNT.. test_ynamic_sql_multi_row_id. LOOP -
'id='DBMS_OUTPUT.put_line( || test_ynamic_sql_multi_row_id(m) || -
',name='|| test_ynamic_sql_multi_row_name(m)); -
ENDLOOP; - END;
DECLARE
v_sql VARCHAR2(1000);
v_table VARCHAR2(30) := 'test_ynamic_sql';
--1、使用基于多个嵌套表获取多行输出
TYPE test_ynamic_sql_id_type IS TABLE OF test_ynamic_sql.ID%TYPE INDEX BY BINARY_INTEGER;
TYPE test_ynamic_sql_name_type IS TABLE OF test_ynamic_sql.NAME%TYPE INDEX BY BINARY_INTEGER;
test_ynamic_sql_multi_row_id test_ynamic_sql_id_type;
test_ynamic_sql_multi_row_name test_ynamic_sql_name_type;
BEGIN
--1、使用基于多个嵌套表获取多行输出
v_sql := ' select id,name from ' || v_table;
EXECUTE IMMEDIATE v_sql BULK COLLECT
INTO test_ynamic_sql_multi_row_id, test_ynamic_sql_multi_row_name;
FOR m IN 1 .. test_ynamic_sql_multi_row_id.COUNT LOOP
DBMS_OUTPUT.put_line('id=' || test_ynamic_sql_multi_row_id(m) ||
',name=' || test_ynamic_sql_multi_row_name(m));
END LOOP;
END;
1.2.4
1.2.4.1
DECLARE
v_sql VARCHAR2(1000);
v_name VARCHAR2(100);
BEGIN
--1、先创建测试函数
v_sql := ' CREATE OR REPLACE FUNCTION f_test_ynamic_sql(v_id VARCHAR2) RETURN VARCHAR2 IS
v_name VARCHAR2(100);
BEGIN
SELECT NAME INTO v_name FROM test_ynamic_sql WHERE id = v_id;
RETURN v_name;
END ; ';
EXECUTE IMMEDIATE v_sql;
--2、 使用select 获取返回值
v_sql := ' select f_test_ynamic_sql(:1) from dual';
EXECUTE IMMEDIATE v_sql
INTO v_name
USING '1';
DBMS_OUTPUT.put_line(' NAME = ' || v_name);
END;
1.2.4.2
DECLARE
v_sql VARCHAR2(1000);
v_name_o VARCHAR2(100);
BEGIN
--1、先创建测试函数
v_sql := ' CREATE OR REPLACE FUNCTION f_test_ynamic_sql(v_id VARCHAR2,v_name_o out varchar2) RETURN VARCHAR2 IS
v_name VARCHAR2(100);
BEGIN
SELECT NAME INTO v_name FROM test_ynamic_sql WHERE id = v_id;
v_name_o:=v_name;
RETURN v_name;
END ; ';
EXECUTE IMMEDIATE v_sql;
--2、使用begin .. end绑定函数输出变量
v_sql := ' declare v_name varchar2(100);
begin v_name:=f_test_ynamic_sql(:1,:2); end;';
EXECUTE IMMEDIATE v_sql
USING '1', OUT v_name_o;
DBMS_OUTPUT.put_line('name_o=' || v_name_o); --using中的输出变量需要显示说明
END;
1.2.5
- DECLARE
-
v_sql VARCHAR2(1000); -
v_name_o VARCHAR2(100); - BEGIN
-
--1、先创建测试过程 -
CREATEv_sql := ' OR REPLACE procedure p_test_ynamic_sql(v_id outVARCHAR2,v_name_o varchar2) IS -
BEGIN -
SELECTNAME INTO v_name_o FROMtest_ynamic_sql WHEREid = v_id; -
END; '; -
EXECUTEIMMEDIATE v_sql; -
--2、使用begin.. end绑定过程输出变量 -
'v_sql := begin ;p_test_ynamic_sql(:1,:2); end;' -
EXECUTEIMMEDIATE v_sql -
'1',USING OUT v_name_o; --using中的输出变量需要显示说明 -
'name_o='DBMS_OUTPUT.put_line( || v_name_o); - END;

加载中…