oracle存储过程----------循环语句,判断语句,游标简单使用

时间:2025-03-10 08:28:21

1、简单的存储过程创建

CREATE OR REPLACE PROCEDURE CREATE_VIEW(dblink_name varchar,table_name varchar,view_name varchar)
         IS
              V_SQL VARCHAR2(10240);
         BEGIN
              V_SQL := 'CREATE OR REPLACE VIEW '||view_name||' AS (select * from     
                        '||table_name||'@'||dblink_name||')';
              EXECUTE IMMEDIATE V_SQL;
         END;

2、循环语句

        2.1、简单循环

                       语句:LOOP
                                      要执行的语句;
                                      EXIT WHEN <条件语句> --条件满足,退出循环语句
                                  END LOOP;

DECLARE
    int NUMBER(2) :=0;
BEGIN
   LOOP
      int := int + 1;
      DBMS_OUTPUT.PUT_LINE('int 的当前值为:'||int);
      EXIT WHEN int =10;
   END LOOP;
END;

        2.2、WHILE循环

          语句: WHILE <布尔表达式> LOOP
                             要执行的语句;
                       END LOOP;

DECLARE 
  x NUMBER :=1;
BEGIN
   WHILE x<=10 LOOP
      DBMS_OUTPUT.PUT_LINE('X的当前值为:'||x);
       x:= x+1;
   END LOOP;
END;

        2.3、FOR循环              

            语句:FOR 循环计数器 IN [ REVERSE ] 下限 .. 上限 LOOP
                                  要执行的语句;
                        END LOOP [循环标签];

        每循环一次,循环变量自动加1;使用关键字REVERSE,循环变量自动减1。跟在IN REVERSE 后面的数字必须是从小到大的顺序,而且必须是整数,不能是变量或表达式。可以使用EXIT退出循环

BEGIN
   FOR int  in 1..10 LOOP
       DBMS_OUTPUT.PUT_LINE('int 的当前值为: '||int);
   END LOOP;
END;

3、判断语句

        语句:IF 判断条件 THEN

                        执行的语句;

                   ELSIF 判断条件 THEN

                        执行语句;

                  ELSE

                         执行语句;

                  END IF;

DECLARE 
  x varchar2 :='住宅';
  t number;
BEGIN 
      IF x = '住宅' THEN
        t := 0;
      ELSIF x = '商务' THEN
        t := 2;
      ELSIF x = '商住' THEN
        t := 3;
      ELSE
        t := 9;
      END IF;
END;

4、游标

        语句:cursor 

                  [cursor变量名称]([参数名称] [参数类型]) 

                  IS 

                  [SQL语句,可以使用传入参数]

CURSOR 
cur_netnode 
IS
    SELECT DISTINCT code
    FROM tmp_fetch_data t --for test 优化1
    WHERE code IS NOT NULL;

        4.1、遍历游标的值

                4.1.1、loop fetch使用  

                fetch [cursor变量] into [循环变量]

                when [cursor变量] %notfound;

 DECLARE
    CURSOR cur_netnode IS
      SELECT DISTINCT code
        FROM tmp_fetch_data t
       WHERE code IS NOT NULL;
  BEGIN
    OPEN cur_netnode; --打开游标
    LOOP
      FETCH cur_netnode 
        INTO v_code_src; -- 对应游标查询出的参数值
      EXIT WHEN cur_netnode%NOTFOUND; -- 结束循环条件
      SELECT COUNT(1)
        INTO v_flag_prv
        FROM res_netnode
       WHERE nodename = v_code_src;
      IF v_flag_prv = 0 THEN
        INSERT INTO res_netnode(nodeid,nodename,upnodeid,type,maxsub,status,memo)
        VALUES
          (seq_res_netnode_id.nextval, v_code_src, 0, '1', 0, '1', NULL);
      ELSE
        NULL;
      END IF;
    END LOOP;
  END;

4.1.2、FOR循环方式处理游标

declare
    cursor c_list is select * from  table_User  i where =4;
begin
    for c in c_list loop
        dbms_output.put_line('用户的id='||); -------------输出结果集
    end loop;
end;