Lost !

-----hard working for the furture.

导航

统计

包,存储过程的编写

定义包头:

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;

posted on   失落''80  阅读(97)  评论(0编辑  收藏  举报

编辑推荐:
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
阅读排行:
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?
点击右上角即可分享
微信分享提示