在oracle数据库开发中,有时候需要写sql语句,然后直接返回到前台,所用的技术不再试传统的jdbc封装。
下面我举一个例子,这是我用oracle建包写的一个存储过程。
CREATE OR REPLACE PACKAGE Pkg_Note_d IS
-- Author : ADMINISTRATOR
-- Created : 2016/5/25 10:41:34
-- Purpose : 短信例子
PROCEDURE Note_Add_d;
PROCEDURE Query_Note_d;
END Pkg_Note_d;
/
CREATE OR REPLACE PACKAGE BODY Pkg_Note_d IS
PROCEDURE Note_Add_d IS
--定义一个和note_dingwei一样表结构的变量。
l_Note_Dingwei Note_Dingwei%ROWTYPE;
BEGIN
--注册表
Pkg_Pub.Reg_Proc('PKG_NOTE_D.Note_Add_D');
--通过公共包获取数据
l_Note_Dingwei.Mobile := TRIM(Pkg_Pub.Getstring('mobile'));
l_Note_Dingwei.Note := TRIM(Pkg_Pub.Getstring('note'));
BEGIN
INSERT INTO Note_Dingwei
(n_Id,
Mobile,
Note,
Received_Time)
VALUES
(Note_Seq_d.Nextval,
l_Note_Dingwei.Mobile,
l_Note_Dingwei.Note,
To_Char(SYSDATE,
'yyyy-MM-dd HH24:MI:SS'));
EXCEPTION
WHEN Dup_Val_On_Index THEN
Pkg_Err.Raise_Error(10,
'短信录入失败,主键重复');
ROLLBACK;
WHEN OTHERS THEN
Pkg_Err.Raise_Error(15,
'短信录入失败');
ROLLBACK;
END;
COMMIT;
END Note_Add_d;
PROCEDURE Query_Note_d IS
l_Mobile Note_Dingwei.Mobile %TYPE;
l_n_Id Note_Dingwei.n_Id%TYPE;
l_Rcrdnm INTEGER; --翻页行数
l_Cur_Sql VARCHAR2(2000); --查询语句
BEGIN
Pkg_Pub.Reg_Proc('PKG_NOTE_D.Query_Note_D');
l_Rcrdnm := Nvl(Pkg_Pub.Getnumber('rcrdnm'),
12);
l_Mobile := TRIM(Pkg_Pub.Getstring('mobile'));
l_n_Id := Nvl(TRIM(Pkg_Pub.Getstring('n_id')),
'1');
Dbms_Output.Put_Line(l_Mobile);
l_Cur_Sql := ' select n.* from ( select * from note_dingwei t where 1=1 ';
IF l_Mobile IS NOT NULL THEN
l_Cur_Sql := l_Cur_Sql || ' and t.mobile like ' || '''%' || l_Mobile ||
'%''';
END IF;
l_Cur_Sql := l_Cur_Sql || 'and t.n_Id >' || l_n_Id;
l_Cur_Sql := l_Cur_Sql || ' order by to_number(t.n_id) ) n';
l_Cur_Sql := l_Cur_Sql || ' where rownum <=' || l_Rcrdnm;
Dbms_Output.Put_Line(l_Cur_Sql);
Pkg_Pub.Set_Cursor_Sql(l_Cur_Sql);
Pkg_Pub.Clear_Proc('PKG_NOTE_D.Query_Note_D');
END;
END Pkg_Note_d;
/
在这里有一个点需要说一下' and t.mobile like ' || '''%' || l_Mobile || '%''';这里是英文的单引号。
oracle数据库会自动转义sql为 and t.mobile like '%l_Mobile%'。
给大家分享一下,希望能有所帮助。