在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;