精华内容
下载资源
问答
  • oracle函数调用存储过程.doc
  • ORACLE存储过程调用自定义函数

    万次阅读 2018-03-22 13:21:22
    在写存储过程的时候经常要创建临时表组织数据,创建临时表的时候需要判断该表是否已经存在。 V_SQL:='CREATE TABLE BI_ZJ_ZJGJ( ZHZBH VARCHAR2(20), ZHZMC VARCHAR2(50), DWBH VARCHAR2(20), DWMC VARCHAR2(10....
    在写存储过程的时候经常要创建临时表组织数据,创建临时表的时候需要判断该表是否已经存在。
    
     V_SQL:='CREATE TABLE BI_ZJ_ZJGJ(
                ZHZBH VARCHAR2(20),
                ZHZMC VARCHAR2(50),
                DWBH VARCHAR2(20),
                DWMC VARCHAR2(100),
                ZHNM VARCHAR2(50),
                ZHMC VARCHAR2(200),
                HBZJ NUMBER(20,8),
                YGJZJ NUMBER(20,8),
                GJL NUMBER(20,8)
                )';
    
        SELECT COUNT(1) INTO V_FLAG FROM USER_TABLES WHERE TABLE_NAME='BI_ZJ_ZJGJ';
        IF V_FLAG=0 THEN
           EXECUTE IMMEDIATE V_SQL;
        ELSE
           EXECUTE IMMEDIATE 'DROP TABLE BI_ZJ_ZJGJ';
           EXECUTE IMMEDIATE V_SQL;
        END IF;

    碰到一个存储过程里面要使用多张临时表的时候就要多次重复粘贴该代码了,那为什么不将创建临时表的语句独立出来形成函数,然后在存储过程里面调用呢?

    因此建立一个BI_TEMP_TAB的函数,接收建表语句V_SQL和表名V_NAME,返回一个布尔值表示临时表创建成功。

    CREATE OR REPLACE FUNCTION BI_TEMP_TAB(V_SQL VARCHAR2,V_NAME VARCHAR2)
           RETURN BOOLEAN
    AS
           V_FLAG VARCHAR(10);
           V_OK BOOLEAN;
    BEGIN
           SELECT COUNT(1) INTO V_FLAG FROM USER_TABLES WHERE TABLE_NAME=V_NAME;
           V_OK:=True;
                  IF V_FLAG=0 THEN
                     EXECUTE IMMEDIATE V_SQL;
                     RETURN V_OK;
                  ELSE
                     EXECUTE IMMEDIATE 'DROP TABLE '||V_NAME;
                     EXECUTE IMMEDIATE V_SQL;
                     RETURN V_OK;
                   END IF;
    END;

    在存储过程中需要创建临时表的时候就直接调用该函数:

        V_SQL:='CREATE TABLE BI_ZJ_ZJCFB AS
                SELECT C.ZJZH_ZHBH,C.ZJZH_ZHNM,C.ZJZH_MC,C.ZJZH_ZHZ,E.ZJZHZ_MC,
                C.ZJZH_XZBH,D.ZJZHXZ_XZMC,C.ZJZH_DWBH,A.CODE,A.NAME
                FROM CODEITEMS A,BANKS B,ZJZH C,ZJZHXZ D,ZJZHZ E
                WHERE A.CODE=B.BANKTYPE
                AND   B.BANKID=C.ZJZH_BANKID
                AND   C.ZJZH_XZBH=D.ZJZHXZ_XZBH
                AND   C.ZJZH_ZHZ=E.ZJZHZ_ZHZBH
                AND   A.SETID=''A009''
                AND   C.ZJZH_XZBH<>''04''
                ORDER BY C.ZJZH_DWBH';
    
        V_OK:=BI_TEMP_TAB(V_SQL,'BI_ZJ_ZJCFB');
    这样就简化了临时表的创建过程。
    展开全文
  • Oracle 存储过程函数的创建和调用

    千次阅读 2018-12-15 22:20:52
    一、Oracle 创建和调用存储过程 1、基本语法 create or replace procedure update_emp_sal (Name in out type, Name in out type, ... ) is begin end update_emp_sal; 可能不了解 in 参数, Oracle 过程中定义...

    一、Oracle 创建和调用存储过程

    1、基本语法

    create or replace procedure update_emp_sal
    (Name in out type,
     Name in out type, ...
    ) is
    begin
      
    end update_emp_sal;
    

    可能不了解 in out 参数,
    Oracle 过程中定义了 in / out / in out 三种参数模式。
    (1)in 就是传入但存储过程里面处理的参数,传进去供查询语句使用。
    (2)out 参数就是返回值的参数。返回查询的结果集。
    (3)in out 输入输出模式:能接收传入的实参值;在子程序内部可以修改; 可以输出(必须用实参变量调用)

    in 参数就像 c++ 语言里函数一般的参数那样,而 out 函数就像 c++ 里函数的引用类型参数一样,不知道我比喻是否正确,请高手指点。

    如果不知道参数类型,可以参考:

    create or replace procedure DEPT_AVG_SAL(p_deptno emp.dept_id%TYPE)
    as v_sal emp.salary%TYPE;
    
    begin
          Select avg(salary)  into v_sal
          from emp
        where dept_id = p_deptno;
          dbms_output.put_line(p_deptno || ' : ' || 'average salary is:' || v_sal);
    
    end DEPT_AVG_SAL;
    

    2、写一个简单的例子修改 emp 表的 ename 字段:

    create or replace procedure update_emp
    (
    v_empno  varchar2,
    v_ename  varchar2
    ) is
    begin
    
    update emp set ename=v_ename where empno=v_empno;  
    
    end update_emp;
    

    调用方法如下:

    SQL>exec  update_emp('7935','test');
    

    2、有返回值的存储过程

    就写一个简单的返回 empno=7935 的 sal 值

    create or replace procedure emp_out_sal
     (
     v_empno in varchar2,
     v_sal out number
     ) is
     vsal number(7,2);
     begin
     
     select sal into vsal from emp where empno=v_empno;
     v_sal:=vsal;
     end;
    

    调用有返回值的过程方法(1)

    SQL> var vsal number
    SQL> exec emp_out_sal('7935',:vsal);
    
    PL/SQL procedure successfully completed
    vsal
    

    调用有返回值的过程方法(2)

    SQL> var vsal number
    SQL> call emp_out_sal('7935',:vsal);
    
    Method called
    vsal
    

    二、Oracle 创建和调用函数(function)

    1、基本语法规则如下:

    create or replace function (Name in type, Name in type, ...) return number is
      Result number;
    begin
      
      return (Result);
    end ;
    

    2、写一个简单的查询例子查询出 empno=7935 的 sal 值

    create or replace function ret_emp_sal(v_ename varchar2)
    return number
    is
    v_sal number(7,2);
    begin
    select nvl(sal,0) into v_sal from emp where lower(ename)=lower(v_ename);
    return v_sal;
    end;
    

    调用此函数:

    SQL> var vsla number
    SQL> call ret_emp_sal('7935') into :vsal;
    
    Method called
    vsal
    
    展开全文
  • Oracle 存储过程调用自定义的函数问题?我现在在做一个Oracle数据导入,要将EXCEL数据导入到Oracle数据库中,先读取数据,将数据保存在一张临时表中,然后导入之前对临时表中数据的每个字段做校验,比如数据是否为...

    Oracle 存储过程中调用自定义的函数问题?

    我现在在做一个Oracle数据导入,要将EXCEL数据导入到Oracle数据库中,先读取数据,将数据保存在一张临时表中,然后导入之前对临时表中数据的每个字段做校验,比如数据是否为整数,整数的最大位数,及导入的数据在原数据库中是否已经存在等,我写了一个存储过程,对异常的数据,将字段“is_checked”设为异常信息。

    在对数字型数据做校验时,为了验证该字段是否为数字,或者为整数,我在Oracle中写了一个自定义的数字校验函数,并在存储过程中调用该函数,但是我发现第一次导入时,所有数据校验正常,但是当第二次点击导入的时候,存储过程就不能重新调用该函数,理所当然校验的数据也都是错误的,与第一次校验的结果大为不同,调试修改之后,发现必须重新编译这个校验函数才能正常的校验。这个问题就连现在的项目经理也解决不了了:)

    在这里想问大家,有什么办法可以在存储过程中调用该函数时只需编译一次?或者调用之前对该函数重新编译的方法,有做过类似项目的同仁帮忙解决一下啊:)

    呵呵 比较头疼的问题,也可能是我的校验函数出了问题,以下是我自己写的的Oracle数字校验函数,不知对否,望多多指教~~

    CREATE OR REPLACE FUNCTION IS_POSITIVE_NUMERIC(MyStr VARCHAR2,intMax integer,decimalMax integer) RETURN NUMBER

    IS

    /******************************************************************************

    PURPOSE:   判断输入的字符串是否为合法的正数

    REVISIONS:

    Ver        Date        Author           Description

    ---------  ----------  ---------------  ------------------------------------

    1.0        2008-11-17   lei.zhao     1. Created this procedure.

    输入参数:

    MyStr :要检验的字符串

    intMax:整数部分最大位数

    &

    相关文档:

    方法一,使用SQL*Loader

    这个是用的较多的方法,前提必须oracle数据中目的表已经存在。

    大体步骤如下:

    1   将excle文件另存为一个新文件比如文件名为text.txt,文件类型选文本文件(制表符分隔),这里选择类型为csv(逗号分隔)也行,但是在写后面的control. ......

    1.

    错误提示:ORA-12545:因目标主机或对象不存在,连接失败.

    错误症状:新建的数据库在OEM控制台无法显示(sysman用户登陆),独立启动模式可以找到,但无法登陆,出现如上错误。

    解决办法:修改oracle安装目录下(oracle\ora90\network\ADMIN)的tnsnames.ora文件,将当前数据库添加到监听对象中。修改之后,可以在独立� ......

    一、在PLSQL中创建表:

    create table HWQY.TEST

    (

    CARNO VARCHAR2(30),

    CARINFOID NUMBER

    )

    二、在PLSQL中创建存储过程:

    create or replace procedure pro_test

    AS

    carinfo_id number;

    BEGIN

    select s_CarInfoID.nextval into carinfo_id

    from dual;

    insert into test(test ......

    1.1.1             Oracle物化视图简介

    1.     物化视图说明

    物化视图 (Materialized View),在以前的Oracle版本中称为快照(Snapshot)。Oracle 的物化视图提供了强大的功能,可以用于预先计算并保存表连接或聚集等耗时较多的操作的结果 ......

    oracle中connect by prior实现递归查询

    收集的几条在oracle中通过connect by prior来实现递归查询

    Start with...Connect By子句递归查询一般用于一个表维护树形结构的应用。

    创建示例表:

    CREATE TABLE TBL_TEST

    (

    ID    NUMBER,

    NAME VARCHAR2(100 BYTE),

    PID   NUMBER &nbs ......

    展开全文
  • 第一种情况是返回的游标是某个具体的表或视图的数据,如: SQL-Code: ...在调用的时候只要声明一个该表的ROWTYPE类型就可以了: SQL-Code: 代码如下: CREATE OR REPLACE PROCEDURE P_TESTB AS VARCURSOR SYS_REFCURSOR;
  • -=-=-=-=-=-=-=-=方法被调用-=-=-=-=-=-=-=-=-= function JudgeExist(p_budgetid in varchar2) return number is v_count number(2); begin select count(1) into v_count from project_budget ...

    -=-=-=-=-=-=-=-=方法被调用-=-=-=-=-=-=-=-=-=
    在这里插入图片描述

    function JudgeExist(p_budgetid in varchar2) return number is
        v_count number(2);
      begin
        select count(1)
          into v_count
          from  project_budget
         where budgetid = p_budgetid
           and isdel = 0;
        return v_count;
      end;
    
    

    在这里插入图片描述

     procedure AddProjectBuget(p_returnValue out number,
                                    p_budgetid    in varchar2, --项目预算表数据的唯一id
                                    p_projectid   in varchar2, --项目id
                                    p_projectname in varchar2, --项目名称                        
                                    p_expendtime  in varchar2, --支出日期
                                    p_usage       in varchar2, --用途
                                    p_totalbudget in number, --预算金额(元)
                                    p_spendbudget in number, --支出金额(元)                                
                                    p_applicant   in varchar2, --申请人
                                    p_addperson   in varchar2) --创建人
      
       is
        v_count number(2);
      begin
        v_count := JudgeExist(p_budgetid);
        if v_count = 0 then
          insert into project_budget
            (projectid,
             projectname,
             createtime,
             expendtime,
             totalbudget,
             spendbudget,
             applicant,
             remainbudget,
             usage,
             addperson,
             isdel)
          values
            (p_projectid,
             p_projectname,
             sysdate,
             to_date(p_expendtime, 'yyyy-MM-dd'),
             p_totalbudget,
             p_spendbudget,
             p_applicant,
             p_totalbudget - p_spendbudget, --剩余金额(元)=预算金额(元)-支出金额(元)
             p_usage,
             p_addperson,
             0);
          p_returnValue := 1; --如果添加成功,返回1
        else
          p_returnValue := -2; --如果添加失败,返回-2
        end if;
      
        commit;
      exception
        when others then
          begin
            raise_application_error(-20999,
                                    '程序出错,错误代码:' || sqlcode || '错误信息:' ||
                                    sqlerrm);
            p_returnValue := -1;
            rollback;
          end;
      end;
    

    -=-=-=-=-=-=-=-=存储过被调用-=-=-=-=-=-=-=-=-=
    在这里插入图片描述

     procedure TestDemo(p_returnValue out number, p_budgetid in varchar2) is
        v_count number(2);
      begin
        select count(1)
          into v_count
          from vcom_project_budget
         where budgetid = p_budgetid
           and isdel = 0;
        p_returnValue := v_count;
      end;
    

    在这里插入图片描述

      /*
      || 编辑集时通项目预算表 
      || lj  2019/12/27
      */
    
      procedure UpdProjectBuget(p_returnValue  out varchar2,
                                    p_budgetid     in varchar2, --项目预算表数据的唯一id
                                    p_projectid    in varchar2, --项目id
                                    p_projectname  in varchar2, --项目名称                        
                                    p_expendtime   in varchar2, --支出日期
                                    p_usage        in varchar2, --用途
                                    p_totalbudget  in number, --预算金额(元)
                                    p_spendbudget  in number, --支出金额(元)
                                    p_applicant    in varchar2, --申请人
                                    p_modityperson in varchar2) --修改人 
       is
        v_count number(2);
      begin
        -- v_count := JudgeExist(p_budgetid);
        TestDemo(p_returnValue => v_count, p_budgetid => p_budgetid);
        if v_count = 0 then
          p_returnValue := -2; --如果不存在就无法修改,返回-2
          return;
        end if;
        update  project_budget
           set projectid    = p_projectid,
               projectname  = p_projectname,
               expendtime   = to_date(p_expendtime, 'yyyy-MM-dd'),
               usage        = p_usage,
               totalbudget  = p_totalbudget,
               spendbudget  = p_spendbudget,
               remainbudget = p_totalbudget - p_spendbudget, --剩余金额(元)=预算金额(元)-支出金额(元)
               applicant    = p_applicant,
               modityperson = p_modityperson,
               modityptime  = sysdate
         where budgetid = p_budgetid;
        p_returnValue := 1; --修改成功,返回1
        commit;
      exception
        when others then
          begin
            raise_application_error(-20999,
                                    '程序出错,错误代码:' || sqlcode || '错误信息:' ||
                                    sqlerrm);
            p_returnValue := -1;
            rollback;
          end;
      end;
    
    
    展开全文
  • JAVA调用ORACLE的存储过程函数的返回结果集 2017年05月11日 21:03:18 彖爻之辞 阅读数:1091 标签: oracle存储 更多 个人分类: --------1.1 ORACLE 具体过程如下: CREATE TABLE STOCK_PRICES( RIC ...
  • 本文实例讲述了Python使用cx_Oracle调用Oracle存储过程的方法。分享给大家供大家参考,具体如下: 这里主要测试在Python中通过cx_Oracle调用PL/SQL。 首先,在数据库端创建简单的存储过程。 create or replace ...
  • 存储在数据库中供所有用户程序调用的子程序叫做存储过程存储函数。 区别:是否可以通过return返回函数值。存储函数可以通过return返回函数值,而存储过程不可以。 相同点:完成特定功能的程序。 由于通过out...
  • 函数,变量,游标等PL/SQL程序3程序包类似java的jar包,存储过程函数,变量,游标等相当jar包提供的方法4调用程序包里面的存储过程函数等元素时,oracle会把程序包调入内存,下次是使用,直接从内存读取。...
  • ORACLE 用户自定义异常小例子  1.进入pl/sql测试窗口  2.执行语句  declare  empname varchar2(255);  customize_exp EXCEPTION; –自定义异常  begin  FOR c IN (select d.* from scott.dept d) ...
  • 本文实例讲述了oracle 存储过程函数和触发器用法。分享给大家供大家参考,具体如下: 一、存储过程存储函数存储在数据库中供所有用户程序调用的子程序叫存储过程存储函数。 创建存储过程 用CREATE ...
  • Oracle 如何创建并使用存储过程调用函数 一、oracle存储过程的创建语法与示例 1、基本语法 create or replace procedure 存储过程名称 ( 参数别名 in 参数类型,(in为入参) 参数别名 in 参数类型,(in为入参) ...
  • oracle 存储过程函数调用方法

    千次阅读 2017-02-10 14:58:14
    存储过程(PROCEDURE) 使用过程, 不仅可以简化客户端应用程序的开发和维护,而且可以提高应用程序的运行性能. CREATE [OR REPLACE] PROCUDURE procedure_name (arg1 [model1] datatype1, arg2[model2] datatype2) ...
  • java调用oracle存储过程或者函数
  • NULL 博文链接:https://fengtiejun.iteye.com/blog/1603851
  • NULL 博文链接:https://fruitking.iteye.com/blog/1447333
  • Oracle数据库子程序之存储过程函数调用 PL/SQL——无名块,不存储在数据库中,不能从其他的PL/SQL块中调用。而下面介绍的结构——函数过程、包和触发器都是有名块,它们可以存储在数据库中,并且可以在需要的...
  • Oracle存储过程调用

    2020-12-16 01:18:05
    Oracle存储过程语法 Oracle的存储过程语法如下: create procedure 存储过程名称(随便取) is 在这里可以定义常量、变量、游标、复杂数据类型这里可以定义变量、常量 begin 执行部分 end; (2)带参数的存储...
  • PL/SQL中的过程函数(通常称为子程序)是PL/SQL块的一种特殊的类型,这种类型的子程序可以以编译的形式存放在数据库中,并为后续的程序块调用。 相同点: 完成特定功能的程序 不同点:是否用return语句返回值。 ...
  • oracle存储过程函数、触发器和包

    千次阅读 2018-05-22 07:52:46
    存储过程的创建带参数的存储过程的使用存储过程的管理函数的创建和使用触发器的类型和作用程序包的创建和使用存储过程1、存储过程的创建2、调用存储过程3、带参数的存储过程4、修改与删除存储过程5、查询存储过程的...
  • 本文是与从Hibernate调用各种关系数据库系统存储过程和数据库函数相关的一系列帖子的一部分。写下来的原因是因为有许多与底层JDBC驱动程序支持相关的特性,并不是每个关系数据库都支持每个JPA或Hibernate特性。 ...
  • oracle存储过程存储函数总结

    千次阅读 2018-01-07 10:20:02
    PL/SQL语法 存储过程 存储函数 触发器
  • Oracle创建和调用存储过程,函数,视图

    千次阅读 2017-11-29 09:33:17
    【1】Oracle创建和调用存储过程 1:写一个简单的例子删除三级级联 1)create or replace procedure ww_procedure_servicecheck (V_ID IN NUMBER)-- 定义输入变量 IS begin  DELETE FROM ww_mt_index_dt WHERE ...
  • oracle存储过程函数的区别

    万次阅读 2017-08-15 22:49:38
    定义: 存储过程(Stored Procedure )是一组为了完成特定功能的SQL 语句集,经编译后存储在数据库...存储过程是由流控制和SQL 语句书写的过程,这个过程经编译和优化后存储在数据库服务器中,应用程序使用时只要调用
  • 比较1 ...存储过程调用方式: 独立的调用语句,如: begin proc1; end; 函数调用方式: 以表达式方式调用,如: declare v_result number; begin v_result := func1; end; 比较...
  • 主要介绍了Oracle存储过程调用DBLink同义词出现错误:PLS-00201: 必须声明标识符的相关资料,需要的朋友可以参考下
  • 本文主要介绍存储过程存储函数的简单使用方法,例如创建及调用方式及其在应用程序中的使用方法,文中用到的光标和包的相关知识将在下篇文章中介绍。
  • 总的来说,plsql就是为了提高效率的把能在java中写的逻辑放到数据库执行,而执行过程和执行函数就是把plsql包装了一下,包装成一个个方法可以让java来调用,java是不能直接调用plsql的,但可以调用存储过程,存储函数,而...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 86,366
精华内容 34,546
关键字:

oracle存储过程调用函数