在Oracle数据库开发PL/SQL块中我们使用的SQL
静态SQL: 在PL/SQL块中使用的SQL语句在编译时是明确的,执行的是确定对象。
动态SQL: 在PL/SQL块编译时SQL语句是不确定的,如根据用户输入的参数的不同而执行不同的操作。
1、跟据动态条件获得数据集
/*定义游标*/
TYPE App_CUR IS REF CURSOR;
/*定义存储过程*/
PROCEDURE sp_QueryAppName(p_where1 VARCHAR2,
p_where2 VARCHAR2,
p_where3 VARCHAR2,
P_outCursor1 OUT App_CUR);
/*实现存储过程 查询表 返回游标*/
PROCEDURE sp_QueryAppName(p_where1 VARCHAR2,
p_where2 VARCHAR2,
p_where3 VARCHAR2,
P_outCursor OUT App_CUR) IS
mainSql varchar2(32767);
condition varchar2(32767);
BEGIN
--动态条件
IF p_where1 IS NOT NULL THEN
condition := condition || ' AND t.where1 = ''' || p_where1 || '''';
END IF;
IF p_where2 IS NOT NULL THEN
condition := condition || ' AND t.where2 = ''' || p_where2 || '''';
END IF;
IF p_where3 IS NOT NULL THEN
condition := condition || ' AND t.where3 = ''' || p_where3 || '''';
END IF;
--动态语句
mainSql := 'SELECT t.field1, t.field2, t.field3, t.field4 FROM table1 t ' ||
condition || ' ORDER BY t.fieldname DESC';
--执行语名并返回游标
OPEN P_outCursor FOR mainSql;
EXCEPTION
WHEN OTHERS THEN
null;
END;
注:定义部分应置于包头,实现部分应置于包体
TYPE App_CUR IS REF CURSOR;
/*定义存储过程*/
PROCEDURE sp_QueryAppName(p_where1 VARCHAR2,
p_where2 VARCHAR2,
p_where3 VARCHAR2,
P_outCursor1 OUT App_CUR);
/*实现存储过程 查询表 返回游标*/
PROCEDURE sp_QueryAppName(p_where1 VARCHAR2,
p_where2 VARCHAR2,
p_where3 VARCHAR2,
P_outCursor OUT App_CUR) IS
mainSql varchar2(32767);
condition varchar2(32767);
BEGIN
--动态条件
IF p_where1 IS NOT NULL THEN
condition := condition || ' AND t.where1 = ''' || p_where1 || '''';
END IF;
IF p_where2 IS NOT NULL THEN
condition := condition || ' AND t.where2 = ''' || p_where2 || '''';
END IF;
IF p_where3 IS NOT NULL THEN
condition := condition || ' AND t.where3 = ''' || p_where3 || '''';
END IF;
--动态语句
mainSql := 'SELECT t.field1, t.field2, t.field3, t.field4 FROM table1 t ' ||
condition || ' ORDER BY t.fieldname DESC';
--执行语名并返回游标
OPEN P_outCursor FOR mainSql;
EXCEPTION
WHEN OTHERS THEN
null;
END;
注:定义部分应置于包头,实现部分应置于包体
2、动态操作表数据
/*定义存储过程*/
PROCEDURE sp_InsertAppName(p_field1 VARCHAR2,
p_field2 VARCHAR2,
p_field3 OUT INTEGER);
/*实现存储过程 添加加数据 返回编码*/
PROCEDURE sp_InsertAppName(p_field1 VARCHAR2,
p_field2 VARCHAR2,
p_field3 OUT INTEGER) IS
i_id INTEGER;
mainSql varchar2(32767);
BEGIN
SELECT sequencename.nextval INTO i_id FROM DUAL;
p_field3 := i_id;
mainSql = 'INSERT INTO tablename values(' || i_id || ',:1,:2)';
--动态执行插入操作
execute immediate str_sql using field1,field2;
EXCEPTION
WHEN OTHERS THEN
null;
END;
注:定义部分应置于包头,实现部分应置于包体
PROCEDURE sp_InsertAppName(p_field1 VARCHAR2,
p_field2 VARCHAR2,
p_field3 OUT INTEGER);
/*实现存储过程 添加加数据 返回编码*/
PROCEDURE sp_InsertAppName(p_field1 VARCHAR2,
p_field2 VARCHAR2,
p_field3 OUT INTEGER) IS
i_id INTEGER;
mainSql varchar2(32767);
BEGIN
SELECT sequencename.nextval INTO i_id FROM DUAL;
p_field3 := i_id;
mainSql = 'INSERT INTO tablename values(' || i_id || ',:1,:2)';
--动态执行插入操作
execute immediate str_sql using field1,field2;
EXCEPTION
WHEN OTHERS THEN
null;
END;
注:定义部分应置于包头,实现部分应置于包体
3、执行存储过程
declare v_msg varchar2(20); begin pk_webinterface.sp_InsertAppName(v_msg); dbms_output.PUT_LINE(v_msg); end;