精华内容
下载资源
问答
  • plsql 调用存储过程

    千次阅读 2017-10-30 11:04:56
    打开sql 命令窗口 如果有输出参数,请先声明。如var str VARCHAR2(50); 调用存储过程 exec proname(参数1,参数2,。。。。,:str); //输出参数前加:

    打开sql 命令窗口

    如果有输出参数,请先声明。如var str VARCHAR2(50);

    调用存储过程 exec proname(参数1,参数2,。。。。,:str); //输出参数前加:


    展开全文
  • 存储过程(Stored Procedure)是在大型数据库系统中,一组为了完成特定功能的SQL 语句集,经编译后存储在数据库中,用户通过指定存储过程的名字并给出参数(如果该存储过程带有参数)来执行它。在大型数据库系统中,...

    存储过程(Stored Procedure)是在大型数据库系统中,一组为了完成特定功能的SQL 语句集,经编译后存储在数据库中,用户通过指定存储过程的名字并给出参数(如果该存储过程带有参数)来执行它。

    在大型数据库系统中,存储过程和触发器具有很重要的作用。无论是存储过程还是触发器,都是SQL 语句和流程控制语句的集合。

    1.基本结构
    CREATE OR REPLACE PROCEDURE 存储过程名字
    (
    参数1 IN NUMBER,
    参数2 IN NUMBER
    ) IS
    变量1 INTEGER :=0;
    变量2 DATE;
    BEGIN

    END 存储过程名字

    2.SELECT INTO STATEMENT
    将select查询的结果存入到变量中,可以同时将多个列存储多个变量中,必须有一条
    记录,否则抛出异常(如果没有记录抛出NO_DATA_FOUND)
    例子:
    BEGIN
    SELECT col1,col2 into 变量1,变量2 FROM typestruct where xxx;
    EXCEPTION
    WHEN NO_DATA_FOUND THEN
    xxxx;
    END;

    3.IF 判断

      IF V_TEST=1 THEN
        BEGIN 
           do something
        END;
      END IF;

    4.while WHILE V_TEST=1 LOOP
    BEGIN
    XXXX
    END;
    END LOOP;量赋值
    V_TEST := 123;

    6.用for in 使用cursor

      ...
      IS
      CURSOR cur IS SELECT * FROM xxx;
      BEGIN
     FOR cur_result in cur LOOP
      BEGIN
       V_SUM :=cur_result.列名1+cur_result.列名2
      END;
     END LOOP;
      END;

    7.带参数的cursor

      CURSOR C_USER(C_ID NUMBER) IS SELECT NAME FROM USER WHERE TYPEID=C_ID;
      OPEN C_USER(变量值);
      LOOP
     FETCH C_USER INTO V_NAME;
     EXIT FETCH C_USER%NOTFOUND;
        do something
      END LOOP;
      CLOSE C_USER;

    8.用pl/sql developer debug
    连接数据库后建立一个Test WINDOW
    在窗口输入调用SP的代码,F9开始debug,CTRL+N单步调试

    简单实例,通过DBMS_OUTPUT来看结果

    CREATE OR REPLACE PROCEDURE bb (lic_para IN VARCHAR2,out_para OUT VARCHAR2)
    AS
       temp   VARCHAR2 (100);
    BEGIN
       SELECT lic_no
         INTO temp
         FROM t_vehicle_info
        WHERE lic_no = lic_para;
        out_para:=temp;
        DBMS_OUTPUT.put_line (out_para);
    END bb;

    下面是调用:

    begin

    – Call the procedure

    bb(lic_para => :lic_para,

     out_para => :out_para);
    

    end;

    可以在命令行里敲sqlplus “yonghuming/mima@dbname”接着调试存储过程。但是最好用的是在pl/sql Developer工具里面用点存储过程里的TEST来调用,它能自动生成调用的语句并有栏目让你输入参数值,包括输入参数和输出参数,并把结果返回到输出参数里面,在结果栏可见,这点pl/sql Developer比TOAD要强,TOAD在存储过程上右键后点击EXECUTE Procedure也可以执行,只是结果在那看我不晓得,而在pl/sql Developer按F9可以调试,ctrl+N可以单步跟踪,的确爽。
    

    以命名的异常

    命名的系统异常 产生原因

    ACCESS_INTO_NULL 未定义对象

    CASE_NOT_FOUND CASE 中若未包含相应的 WHEN ,并且没有设置

    ELSE 时

    COLLECTION_IS_NULL 集合元素未初始化

    CURSER_ALREADY_OPEN 游标已经打开

    DUP_VAL_ON_INDEX 唯一索引对应的列上有重复的值

    INVALID_CURSOR 在不合法的游标上进行操作

    INVALID_NUMBER 内嵌的 SQL 语句不能将字符转换为数字

    NO_DATA_FOUND 使用 select into 未返回行,或应用索引表未初始化的

    TOO_MANY_ROWS 执行 select into 时,结果集超过一行

    ZERO_DIVIDE 除数为 0

    SUBSCRIPT_BEYOND_COUNT 元素下标超过嵌套表或 VARRAY 的最大值

    SUBSCRIPT_OUTSIDE_LIMIT 使用嵌套表或 VARRAY 时,将下标指定为负数

    VALUE_ERROR 赋值时,变量长度不足以容纳实际数据

    LOGIN_DENIED PL/SQL 应用程序连接到 oracle 数据库时,提供了不

    正确的用户名或密码

    NOT_LOGGED_ON PL/SQL 应用程序在没有连接 oralce 数据库的情况下

    访问数据

    PROGRAM_ERROR PL/SQL 内部问题,可能需要重装数据字典& pl./SQL

    系统包

    ROWTYPE_MISMATCH 宿主游标变量与 PL/SQL 游标变量的返回类型不兼容

    SELF_IS_NULL 使用对象类型时,在 null 对象上调用对象方法

    STORAGE_ERROR 运行 PL/SQL 时,超出内存空间

    SYS_INVALID_ID 无效的 ROWID 字符串

    TIMEOUT_ON_RESOURCE Oracle 在等待资源时超时

    存储过程小案例:
    创建一个存储过程

    CREATE OR REPLACE Procedure Proc_Insert
    (
    
    maxValues in varchar2,
    tableName in varchar2
    )
    is
    
    begin
    
    insert into hbpms_pry_record values(sq_hbpms_pry_record_id.nextval,maxValues,tableName);
    
    end Proc_Insert;
    

    查看存储过程是否创建:
    点开Oracle —->>Procedures下面是否有你创建的存储过程

    PLSQL调试存储过程:

    选择存储过程名称 ,右键—>>测试

    运行代码:

    begin
    
      Proc_Insert(0,'hbp_customer_detail_drug');
      commit;
    
    end;
    
    展开全文
  • PLSQL jdbc调用存储过程(入门)
  •  相对于直接使用SQL 语句,在应用程序中直接调用存储过程有以下好处:   (1)减少网络通信量。   (2)执行速度更快。创建时候编译,解析,安全检查和优化,后来不需要重复编译,存在内存之中,直接调用效率高   (3)...

    一.存储过程

       相对于直接使用SQL 语句,在应用程序中直接调用存储过程有以下好处: 
       (1)减少网络通信量。 
       (2)执行速度更快。创建时候编译,解析,安全检查和优化,后来不需要重复编译,存在内存之中,直接调用效率高 
       (3)更强的适应性。  
       (4) 分布式工作。  

    二.简单示例

    1.简单的helloword存储过程,可以直接在客户端直接进行调用

     打印Hello World
    /*
    调用存储过程:
    1. exec sayHelloWorld();
    2. begin
         sayHelloWorld();
         sayHelloWorld();
       end;
       /
    
    */
    create or replace procedure sayHelloWorld
    as
      --说明部分
    begin
       dbms_output.put_line('Hello World');
    
    end;
    /

    2.查询某个员工的信息

    --in 输入参数
    --out 输出参数
    create or replace procedure queryempinfo(eno in number,
                                                pename out varchar2,
                                                psal   out number,
                                                pjob   out varchar2)
    as
    begin
      select ename,sal,empjob into pename,psal,pjob from emp where empno=eno;
    end;
    /

    3.复杂的存储过程

    -- ----------------------------
    -- procedure for addonprice_query
    -- ----------------------------
    -- Create procedure 
    create or replace procedure queryAddOnPrice(out_ow_price out number, voy in varchar2,  airportlines in varchar2, transfer in varchar2,
    			 leavePortTravelStartDate in varchar2,  leavePortTravelEndDate in varchar2, cab in varchar2, fltNum_addOn_In in varchar2, fltNum_addOn_Out in varchar2 )
    as
      
       POW_PRICE INTERNATIONAL_ADDON_XXX.OW_PRICE%type;
    begin
         SELECT   n.OW_PRICE into POW_PRICE   from(
    --   此处对查询出来的结果集进行分组,排序  partition 是分组
         select t.*,row_number() over(partition by INTERNATIONAL_LIMITED_FLIGHTS ,INLAND_LIMITED_FLIGHTS, 
            LEAVEPORT_TRAVEL_START_DATE, LEAVEPORT_TRAVEL_END_DATE,PUTPORT_TRAVEL_END_DATE,PUTPORT_TRAVEL_START_DATE order by UPDATE_TIME DESC,OW_PRICE asc) row_number  from (
          SELECT
             OW_PRICE,
             PUTPORT_TRAVEL_START_DATE,
             PUTPORT_TRAVEL_END_DATE,
             LEAVEPORT_TRAVEL_START_DATE,
             LEAVEPORT_TRAVEL_END_DATE,
             INTERNATIONAL_LIMITED_FLIGHTS,
             INLAND_LIMITED_FLIGHTS,
             UPDATE_TIME
            FROM
                INTERNATIONAL_ADDON_PRICE  addonprice
            WHERE
                1 = 1
            AND ADDON_AIRLINE_ID IN (
                SELECT
                    VOYAGEID
                FROM
                    INTERNATIONAL_ADDON_XXX
                WHERE
                    voyage = voy
            )
            AND AIRLINES LIKE '%'||airportlines||'%'
            AND TRANSFERS LIKE '%'||transfer||'%'
            AND STATUS = 1
            AND CABIN = cab
            AND ((LEAVEPORT_TRAVEL_START_DATE <= leavePortTravelStartDate AND LEAVEPORT_TRAVEL_END_DATE >= leavePortTravelStartDate)  OR (LEAVEPORT_TRAVEL_START_DATE is null and LEAVEPORT_TRAVEL_END_DATE is null ))
        --    AND LEAVEPORT_TRAVEL_END_DATE >= leavePortTravelStartDate
            AND ((PUTPORT_TRAVEL_END_DATE >= leavePortTravelEndDate AND PUTPORT_TRAVEL_START_DATE <= leavePortTravelEndDate) OR (PUTPORT_TRAVEL_END_DATE is null and PUTPORT_TRAVEL_START_DATE is null))
        --    AND PUTPORT_TRAVEL_START_DATE <= leavePortTravelEndDate
            AND leavePortTravelStartDate >= TRAVEL_START_DATE
            AND leavePortTravelEndDate <= TRAVEL_END_DATE
            AND (INLAND_LIMITED_FLIGHTS LIKE '%'||fltNum_addOn_In||'%'  or INLAND_LIMITED_FLIGHTS is null)
            AND (INTERNATIONAL_LIMITED_FLIGHTS LIKE '%'||fltNum_addOn_Out||'%' or INTERNATIONAL_LIMITED_FLIGHTS is null)
         --   AND ( INLAND_LIMITED_FLIGHTS is not null or INTERNATIONAL_LIMITED_FLIGHTS is not null)
          GROUP BY 
             OW_PRICE,
             PUTPORT_TRAVEL_START_DATE,
             PUTPORT_TRAVEL_END_DATE,
             LEAVEPORT_TRAVEL_START_DATE,
             LEAVEPORT_TRAVEL_END_DATE,
             INTERNATIONAL_LIMITED_FLIGHTS,
             INLAND_LIMITED_FLIGHTS,
             UPDATE_TIME
            ORDER BY
              UPDATE_TIME DESC,
              INTERNATIONAL_LIMITED_FLIGHTS nulls last,
              INLAND_LIMITED_FLIGHTS nulls last,
              OW_PRICE asc,
              LEAVEPORT_TRAVEL_START_DATE nulls last,
              LEAVEPORT_TRAVEL_END_DATE nulls last,
              PUTPORT_TRAVEL_START_DATE nulls last,
              PUTPORT_TRAVEL_END_DATE nulls last
              
            ) t
           ) 
            n where ROWNUM = 1;
       out_ow_price := POW_PRICE;
     EXCEPTION
      WHEN NO_DATA_FOUND THEN
      out_ow_price := 0;
      dbms_output.put_line('没有XXXX的数据');
    
    
    end;

    4.java代码调用存储过程

    
    		Session openSession = this.getHibernateTemplate().getSessionFactory().openSession();
    		Connection conn = null;
    		CallableStatement call = null;
    		Double addonPrice = 0d;
    		//String sql = "{?=call queryAddOnPrice(?,?,?,?,?,?,?,?)}";
    		String hql =  "{call queryAddOnPrice(?,?,?,?,?,?,?,?,?)}";
    		try {
    			conn = openSession.connection();
    			call = conn.prepareCall(hql);
    			// out 参数 声明
    			call.registerOutParameter(1, OracleTypes.NUMBER);
    			call.setString(2, voyage);   // in  参数 赋值    
    			call.setString(3, airportlines);
    			call.setString(4, transfers);
    			call.setString(5, leavePortTravelStartDate);
    			call.setString(6, leavePortTravelEndDate);
    			call.setString(7, cabin);
    			call.setString(8, fltNum_addOn_In);
    			call.setString(9, fltNum_addOn_Out);
    			
    			call.execute(); // 执行
    			
    			 addonPrice = call.getDouble(1); // 取出结果
    			 log.info("通过存储过程   国内ADDON价格费用为:" + addonPrice );
    		} catch (Exception e) {
    			log.error("通过存储过程   国内ADDON价格费用出错!");
    			e.printStackTrace();
    		}finally{
    			WebUtil.release(call, conn, openSession);
    		}

     

    展开全文
  • 1、while循环 whike 条件 loop 循环体; end loop; 例:循环打印1-10 DECLARE pnum number :=1; BEGIN dbms_output.put_line('while循环:'); while pnum<=10 loop dbms_output.put_line(pnum);......

    1、while循环

    whike 条件 loop

    循环体;

    end loop;

    例:循环打印1-10

    DECLARE
    pnum number :=1;
    BEGIN
      dbms_output.put_line('while循环:');
      while pnum<=10 loop
        dbms_output.put_line(pnum);
        pnum:=pnum+1;
        end loop;
     END;
     

    2、loop循环

    loop
        exit when 条件;

       循环体;

    end loop;

    例:declare
    pnum number:=1;
    begin
      dbms_output.put_line('loop循环:');
      loop
        exit when pnum>10;
         dbms_output.put_line(pnum);
         pnum:=pnum+1;
        end loop;
      end;
     

    3、for循环

    for    条件 loop
         循环体
        end loop;

    例:注意这里1..10这种写法必须是连续的

    declare
    pnum number:=1;
    begin
      dbms_output.put_line('for循环:');
      for pnum in 1..10 loop
         dbms_output.put_line(pnum);
        end loop;
      end;

    注:三种循环推荐使用第二种loop循环,光标好控制。

    展开全文
  • 开始 如果对异常处理不正确,有可能会导致意想不到...先写两个存储过程 test01 和 test02: CREATE OR REPLACE PROCEDURE test01 IS v_id emp.empno%TYPE; BEGIN UPDATE emp SET ename='test01' WHERE empno=7...
  • 本文主要介绍如何在PL / SQL Developer中调试oracle存储过程. 1打开PL / SQL Developer. 如果计算机上安装了PL / SQL Developer,请打开PL / SQL Developer界面并输入用户名. 密码和主机名与程序的web.config中...
  • plsql存储过程调用和执行

    万次阅读 2011-11-15 09:15:59
     2 存储过程的参数模式 存储过程的参数特性: IN类型的参数 OUT类型的参数 IN-OUT类型的参数 值被 传递给子程序 返回给调用环境 传递给子程序 返回给调用环境 参数形式 常量 未初始化的变量
  • oracle PLSQL创建和调用存储过程

    千次阅读 2014-03-12 15:24:59
    我是在PLSQL的command window里使用的命令 建表  drop table students;  create table students(ID int,userName varchar(100),userpass varchar(100),userAge int);  insert into students values(1,'Jack','...
  • PLsql调试 存储过程

    2017-10-18 14:41:55
    使用PL/SQL Developer的调试功能,对于编写复杂的存储过程,包,funtion...非常有帮助,对执行存储过程形成的结果进行分析时也很有用处,学习之后,果然、当真方便,现将相关步骤摘录如下: 1、首先是编写存储过程...
  • 下面是从 ADF guide 中总结的一段调用 PLSQL 存储过程和函数的方法,仅供参考。   1 ,调用没有参数的存储过程 可以使用 executeCommand () 函数,在 AM 的实现类中可以这样来使用: getDBTransaction()....
  • PLSQL存储过程调试

    千次阅读 2020-09-23 15:22:46
    在工作或者学习中,我们经常会遇到储存过程调用报错或者函数、触发器、包体等调用报错,如果完全依赖个人经验去排查问题,明显是不现实的,所幸PL/SQL Developer工具提供了强大的调试功能,完全可以与其他变成语言的...
  • PLSQL-存储过程

    2016-10-22 19:13:03
    【无返回值,有 out 型参数】--定义一个存储过程,获取给定部门的工资总和(通过 out 参数)。 --要求:部门号和工资总额定义为参数create or replace procedure get_sal2(dept_id number,sumsal out number)ascursor ...
  • 最近在学习oracle,主要学习了plsql块。发现这种语言操作数据库十分方便,如果可以在vc中直接调用plsql的函数或者存储过程会比直接使用sql语句方便很多,但是不知道用什么方式去调用,求解答?
  • 存储过程存储在数据库中供用户调用的子程序,由于存储过程存储在数据库中已经编译好的程序,在调用的时候,不必再次进行编译,从而提高了程序的运行效率. 2.存储过程的语法 创建存储过程的语法 create [or ...
  • oracle11g plsql调试存储过程卡死的处理技巧
  • 在系统性能测试中,常常会使用到存储过程往数据库中灌入大量的数据,用于模拟系统在真实的环境下的性能,以下将分享在评价库添加1w条数据的脚本。
  • 在存储过程中使用下面语句: ...调用存储过程,将输出结果打印到命令窗口。 有时,存储过程执行成功后,未看到输出的结果,原因可能是没有打开输出开关,执行一下下面语句即可 setserveroutput on; ...
  • PLSQL_存储过程和函数

    千次阅读 2017-04-06 17:18:55
    存储过程概述 存储过程是子程序的一种类型,能够完成一些任务,作为schema对象存储于...一个存储过程通常包含定义部分,执行部分,Exception部分,可以被其他子程序调用,也可以被重用。过程定义CREATE [OR REPLACE
  • PLSQL调试存储过程无法进入单步调试

    千次阅读 2016-11-22 11:06:05
    使用PLSQL工具调试存储过程的时候,不管你怎么设置断点,当你点击测试的时候就瞬间执行而过你无法进入单步调试 解决办法:
  • oracle 存储过程以及plsql语句

    万次阅读 2016-04-13 22:40:41
    1、 PLSQL语法 1.1、程序结构  PL/SQL程序都是以块(block)为基本单位。整个PL/SQL块分三部分:声明部分(用declare开头)、执行部分(以 begin开头)和异常处理部分(以exception开头)。其中执行部分是必须的...
  • 【Oracle基础】存储过程,存储函数,触发器,java调用存储过程1. 存储过程2. 存储函数3. 触发器4. java调用存储过程 1. 存储过程 存储过程(Stored Procedure)是在大型数据库系统中,一组为了完成特定功能的 SQL ...
  • Oracle/PLSQL存储过程详解

    万次阅读 多人点赞 2018-03-14 17:31:55
    plsql中创建一个存储过程打开plsql,右键procedures,新建。如果新建毫无反应直接文件-新建-程序窗口-空白,新建一个程序窗口: 存储过程创建语法: create [or replace] procedure 存储过程名(param1 in type,...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 6,330
精华内容 2,532
关键字:

plsql调用存储过程语句