包,存储过程的编写
定义包头:
CREATE OR REPLACE PACKAGE DYG_TEST_2016 IS
--定义类型
TYPE T_CURSOR IS REF CURSOR;
FUNCTION COMPUTE_TAX(SALARY NUMBER) RETURN NUMBER;
PROCEDURE GETALL(NAMESTR IN VARCHAR2, IO_CURSOR OUT T_CURSOR); --模糊查询
PROCEDURE TESTDATE; --测试
PROCEDURE GETBYPAGE(P_TABLENAME VARCHAR2,
P_FIELDS VARCHAR2,
P_FILTER VARCHAR2,
P_SORT VARCHAR2,
P_CURPAGE NUMBER,
P_PAGESIZE NUMBER,
P_CURSOR OUT T_CURSOR,
P_TOTALRECORDS OUT NUMBER); --分页
PROCEDURE MODIFY(V_ID IN VARCHAR2, V_MSG OUT VARCHAR2);
PROCEDURE DELDATA(V_ID IN VARCHAR2, V_MSG OUT VARCHAR2);
END DYG_TEST_2016;
包体编写:
CREATE OR REPLACE PACKAGE BODY DYG_TEST_2016 IS
FUNCTION COMPUTE_TAX(SALARY NUMBER) RETURN NUMBER IS
BEGIN
IF SALARY < 5000 THEN
RETURN SALARY * .15;
ELSE
RETURN SALARY * .33;
END IF;
END COMPUTE_TAX;
PROCEDURE GETALL(NAMESTR IN VARCHAR2, IO_CURSOR OUT T_CURSOR) IS
V_CURSOR T_CURSOR;
V_SQL VARCHAR2(2000);
BEGIN
V_SQL := 'select p.* from zy_test_product p where p.product_name like ''' ||
NAMESTR || '%''';
OPEN V_CURSOR FOR V_SQL;
IO_CURSOR := V_CURSOR;
--dyg_test_2016.testdate();
END GETALL;
PROCEDURE TESTDATE IS
BEGIN
DBMS_OUTPUT.PUT_LINE(SYSDATE);
END TESTDATE;
PROCEDURE GETBYPAGE(P_TABLENAME VARCHAR2, --要查询的表名
P_FIELDS VARCHAR2, --要查询的字段
P_FILTER VARCHAR2, --过滤条件
P_SORT VARCHAR2, --排序字段及方向
P_CURPAGE NUMBER, --当前页
P_PAGESIZE NUMBER, --页大小
P_CURSOR OUT T_CURSOR,
P_TOTALRECORDS OUT NUMBER) IS
V_SQL VARCHAR2(1000) := '';
V_STARTRECORD NUMBER(4);
V_ENDRECORD NUMBER(4);
BEGIN
--获取总的记录数
V_SQL := 'select to_number(count(*)) from ' || P_TABLENAME;
IF P_FILTER IS NOT NULL THEN
V_SQL := V_SQL || ' where 1=1 and ' || P_FILTER;
END IF;
EXECUTE IMMEDIATE V_SQL
INTO P_TOTALRECORDS;
V_STARTRECORD := (P_CURPAGE - 1) * P_PAGESIZE;
V_ENDRECORD := P_CURPAGE * P_PAGESIZE;
V_SQL := 'select ' || P_FIELDS || ' from (select A.' || P_FIELDS ||
' ,rownum r from ' || '(select ' || P_FIELDS || ' from ' ||
P_TABLENAME;
IF P_FILTER IS NOT NULL THEN
V_SQL := V_SQL || ' where 1=1 and ' || P_FILTER;
END IF;
IF P_SORT IS NOT NULL THEN
V_SQL := V_SQL || ' order by ' || P_SORT;
END IF;
V_SQL := V_SQL || ') A where rownum<=' || TO_CHAR(V_ENDRECORD) ||
') B where r>' || TO_CHAR(V_STARTRECORD);
--DBMS_OUTPUT.put_line(v_sql);
OPEN P_CURSOR FOR V_SQL;
END GETBYPAGE;
PROCEDURE MODIFY(V_ID IN VARCHAR2, V_MSG OUT VARCHAR2) IS
BEGIN
--dbms_output.put_line('Hello world');
IF V_ID IS NULL THEN
V_MSG := '参数错误';
ELSE
BEGIN
--执行SQL
UPDATE ZY_TEST_PRODUCT P
SET P.PRODUCT_NAME = 'ccc--'
WHERE P.PID = TO_NUMBER(V_ID);
IF SQL%ROWCOUNT > 0 THEN
V_MSG := '更新成功';
COMMIT;
ELSE
V_MSG := '更新失败';
ROLLBACK;
END IF;
EXCEPTION
WHEN OTHERS THEN
-- dbms_output.put_line('更新失败');
V_MSG := '更新失败';
END;
END IF;
END MODIFY;
PROCEDURE DELDATA(V_ID IN VARCHAR2, V_MSG OUT VARCHAR2) IS
BEGIN
IF V_ID IS NULL THEN
V_MSG := '参数错误';
ELSE
DELETE ZY_TEST_PRODUCT P WHERE P.PID = TO_NUMBER(V_ID);
IF SQL%ROWCOUNT > 0 THEN
COMMIT;
V_MSG := '删除成功';
ELSE
V_MSG := '删除失败';
ROLLBACK;
END IF;
END IF;
END DELDATA;
END DYG_TEST_2016;
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?