zoukankan      html  css  js  c++  java
  • oracle 基本语法(1)

    为了方便自己以后查询,特意从网上找了一些材料保存

    1.基本结构
    CREATE OR REPLACE PROCEDURE 存储过程名字
    (
        参数1 IN NUMBER,
        参数2 IN NUMBER
    ) IS | AS
    变量1 INTEGER :=0;
    变量2 DATE;
    BEGIN
    END 存储过程名字
    说明:is也可换成as

    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;
      单循环:
     LOOP
       statements
    END  LOOP;
     // 一直循环语句段,除非显示的输入EXIT  /   EXIT   WHEN  语句结束循环
          
       WHILE循环:
     WHILE  condition LOOP
         statements
     END  LOOP;

     example:
        count : = 0;
        WHILE  counter <6  LOOP
          count  : = count   +  1  ;
       END LOOP ;
    5.for 循环

     FOR  loop_variable  IN   [ REVERSE ]  lower_bound..upper_bound LOOP
       statements;
     END  LOOP;

     example:
        FOR  id  IN   3 .. 6  LOOP
       DBMS_OUTPUT.PUT_LINE(id);
        END  LOOP;
    6.变量赋值
      V_TEST := 123;
      变量名   变量类型 ;/  :  =   [ 初始数值 ]  ;
     id    INTEGER  ;
      name    VARCHAR2 ( 20 ) : = ' BinMing ' ;
     *  proname product.price % TYPE ;  //  ( % TYPE) 表示proname 的类型要和product表中的price的类型一致。


    7.用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;

    8.带参数的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;

    9.用pl/sql developer debug
      连接数据库后建立一个Test WINDOW
      在窗口输入调用SP的代码,F9开始debug,CTRL+N单步调试
     
     
    10.块结构
     PL/ SQL程序被分割为称为块(block)的结构,块中包含PL / SQL程序语句。典型的PL / SQL块具有
     以下的结构:
     [ DECLARE
         declaration_statements
     ]
     BEGIN
         executable_statements
     [ EXCEPTION
         exception_handling_statements
     ]
     END ;
     语法元素:
     declaration_statement :
       声明了在块的其余部分中使用的变量。这些变量是块的局部变量。
     executable_statment:
       块的实际可执行语句。
     exeception_handling_statement:
       处理可执行语句可能发生的错误。

     注意:每条语句都要有(;)分号结尾,块使用END关键字结尾。

     例程:
     DECLARE
         width  INTEGER  : = 2 ;
         height  INTEGER  ;
         area  INTEGER  ;
     BEGIN
         height : = 3  ;
         area : = width * height ;
     END ;
     /     // 表示执行这个PL / SQL块;
     
    注意:此块必须放到一起写,不能分开
     
    11.游标的使用

     步骤一: 声明变量来存储例值 :

     DECLARE
       id products.id % TYPE;
      
      

     步骤二: 声明游标 :

     游标要放在声明部分中。

     CURSOR  product_cursor  IS   
        Select 
       id,name,price
        FROM
       products
        ORDER   BY
       id;

              // 声明了游标的类型或着说方法

     步骤三:打开游标 :
     使用OPEN语句打开游标,必须放在块的可执行部分中。

        OPEN  product_cursor ;

     步骤四: 从游标中获取行:
     使用  FETCH  语句读取游标中的行:
        FETCH :
       product_cursor;
        INTO
       id,name,price;    // 把值存储到上面声明的三个变量中.
     //  如果游标返回可能包含很多行的话,就要循环取出每一行数据,
       可以使用product_cursor % NOTFOUND决定虚幻何时结束。

     步骤五: 关闭游标:
     CLOSE  product_cursor;
     
    12.在命令窗口下执行 存储过程
     命令: exec 存储过程名
     
     
     
     
    关于oracle存储过程的若干问题备忘
     
    1.在oracle中,数据表别名不能加as,如:
     
    select  a.appname  from  appinfo a; -- 正确
    select  a.appname  from  appinfo  as  a; -- 错误
     也许,是怕和oracle中的存储过程中的关键字as冲突的问题吧
     
    2.在存储过程中,select某一字段时,后面必须紧跟into,如果select整个记录,利用游标的话就另当别论了。
     
       select  af.keynode  into  kn  from  APPFOUNDATION af  where  af.appid = aid  and  af.foundationid = fid; --  有into,正确编译
       select  af.keynode  from  APPFOUNDATION af  where  af.appid = aid  and  af.foundationid = fid; --  没有into,编译报错,提示:Compilation 
      Error: PLS - 00428 : an  INTO  clause  is  expected  in  this  SELECT  statement

     
    3.在利用select...into...语法时,必须先确保数据库中有该条记录,否则会报出"no data found"异常。
       可以在该语法之前,先利用select count(*) from 查看数据库中是否存在该记录,如果存在,再利用select...into...
    4.在存储过程中,别名不能和字段名称相同,否则虽然编译可以通过,但在运行阶段会报错
     
      select  keynode  into  kn  from  APPFOUNDATION  where  appid = aid  and  foundationid = fid; --  正确运行
    select  af.keynode  into  kn  from  APPFOUNDATION af  where  af.appid = appid   and  af.foundationid = foundationid ; --  运行阶段报错,提示
    ORA - 01422 :exact  fetch   returns  more than requested  number   of  rows
     
    5.在存储过程中,关于出现null的问题
    假设有一个表A,定义如下:
    create   table  A(
    id  varchar2 ( 50 )  primary   key   not   null ,
    vcount  number ( 8 )  not   null ,
    bid  varchar2 ( 50 )  not   null   --  外键 
    );
    如果在存储过程中,使用如下语句:
    select sum(vcount) into fcount from A  where  bid = ' xxxxxx ' ;
    如果A表中不存在bid="xxxxxx"的记录,则fcount=null(即使fcount定义时设置了默认值,如:fcount number(8):=0依然无效,fcount还是会变成null),这样以后使用fcount时就可能有问题,所以在这里最好先判断一下:
    if  fcount  is   null  then
        fcount: = 0 ;
    end  if ;
    这样就一切ok了。
     
    6.Hibernate调用oracle存储过程
     
             this .pnumberManager.getHibernateTemplate().execute(
                     new  HibernateCallback()  {
                         public  Object doInHibernate(Session session)
                                 throws  HibernateException, SQLException  {
                            CallableStatement cs  =  session
                                    .connection()
                                    .prepareCall( " {call modifyapppnumber_remain(?)} " );
                            cs.setString( 1 , foundationid);
                            cs.execute();
                             return   null ;
                        }
                    } );

  • 相关阅读:
    剑指Offer-30.连续子数组的最大和(C++/Java)
    剑指Offer-29.最小的K个数(C++/Java)
    UVA 1616 Caravan Robbers 商队抢劫者(二分)
    UVA 10570 Meeting with Aliens 外星人聚会
    UVA 11093 Just Finish it up 环形跑道 (贪心)
    UVA 12673 Erratic Expansion 奇怪的气球膨胀 (递推)
    UVA 10954 Add All 全部相加 (Huffman编码)
    UVA 714 Copying Books 抄书 (二分)
    UVALive 3523 Knights of the Round Table 圆桌骑士 (无向图点双连通分量)
    codeforecs Gym 100286B Blind Walk
  • 原文地址:https://www.cnblogs.com/edison2012/p/2319916.html
Copyright © 2011-2022 走看看