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 ;
                        }
                    } );

  • 相关阅读:
    vsphere client cd/dvd 驱动器1 正在连接
    使用SecureCRT上传和下载文件
    java android 将 List中元素互换位置
    java中Math常用方法
    关于View转化成bitmap保存成图片
    Java中Math类的几个四舍五入方法的区别
    Math.round(),Math.ceil(),Math.floor()的区别
    动态的添加ImageView到LinearLayout中并居中显示
    android之View坐标系(view获取自身坐标的方法和点击事件中坐标的获取)
    Android 代码设置RelativeLayout元素居中
  • 原文地址:https://www.cnblogs.com/edison2012/p/2319916.html
Copyright © 2011-2022 走看看