Oracle――Sql语法总结(一)

2015-11-21 03:27:00 · 作者: · 浏览: 36

-- 语句块
declare
  v_name varchar2(30) := 'Jack' -- 定义变量
begin
  select v_name from dual;
exception
  when others then
    dbms_output.put_line('有异常');
end;

-- if 判断
declare
  v_num1 number;
  v_num2 number;
  v_result varchar2(10);
begin
  if v_num1 is null or v_num2 is null then
    v_result := 'Undefined';
  elsif v_num1 > v_num2 then
    v_result := 'num1 is big';
  else
    v_result := 'num2 is big';
  end if;
end
  
-- case 语句
declare
  grade char := 'A';
  remark varchar2(20);
begin
  case grade
    when 'A' then remark = 'is Excellent';  
    when 'B' then remark = 'is Good';
  end case;
end;

-- for 循环
declare
  total integer := 0;
begin
  for i In 1..19 loop
    total := total + 1;
  end loop;
end;

-- loop 循环
declare
  v_count integer := 1;
begin
  loop
    v_count := v_count + 1;
    if  v_count >= 10 then
      exit;
    end if;
  end loop;
end;

-- while loop 循环
declare
  v_num1 := 10;
  while v_num1 >1 loop
    v_num1 := v_num1 + 1;
  end loop;
end;
  
-- 动态sql
 -- execute immediate 语句
  
execute immediate dynamic_sql [into {define_variable [,define_variable2]... |recode}]
  [using [in | out | in out] bind_argument [,[in | out | in out] bind_argument2]...]
  [{returning | return}] into bind_argument [,bind_argument2]...];
  
     dynamic_sql: 表示一个sql语句或者pl/sql语句块字符串表达式
 define_variable: 表示一个存储选择的列的变量值
          recode: 表示存储在所选行的一个用户定义或%rowtype类型的记录%
   bind_argument: 输入bind_argument参数是一个表达式,其值会被传递给动态sql语句,输出bind_argument参数,使存储动态sql语句返回值的一个变量
            into: 在进行单行查询时,指定值被赋值给列的变量或记录,对于查询检索出来的每一个值,into子句都必须有一个与之对应的类型兼容的变量或字段
        returing: 只能用于DML操作,returning into用于指定值被检索值的变量或记录,每个由DML语句返回值必须在returing into子句中有一个相应类型兼容的变量或字段
           using: 使用using子句来绑定动态sql语句中的参数,指定in表示只能输入,out表示输出,in out表示参数输入和输出,默认是in
                  对于DML而言,在returning into子句中放置一个out参数,如果是using子句和return into字句一起使用,则using子句只能包含in参数
    
  execute immediate 语句只能使用处理单行的数据查询,而不能处理多行数据查询
  
-- 执行 DDL
  begin
    execute immediate 'create table temp_table (id integer, name varchar2(20))';
  end;
 

declare 
  plsql varchar2(200);
begin
  plsql := 'declare systime varchar2(20); ''begin select to_char(sysdate,''dd-mm-yyyy day'') into systime from dual; dbms_output.put_line(''当前日期是:''||systime) end;';
  execute immediate plsql;
end;
  
-- 绑定变量,执行动态sql
declare
  plsql varchar2(200);
  t_name varchar2(20) := 'Jock';
  t_id integer := '1002';
begin
  plsql := 'insert into temp_table values(:1,:2)';
  execute immediate plsql using t_name, t_id;
end;

-- pl/sql 异常处理
declare exception_name  // 定义异常
raise exception_name  // 触发异常
exception   // 处理异常
  when exception_name then
    statements;
  
declare
  temp_ex exception;
  t_num integer;
begin
  select count(id) into t_num from temp_table where id = '1031';
  if t_num >
= 1 then raise temp_ex; end if; DBMS_OUTPUT.PUT_LINE('该用户不存在'); exception when temp_ex then DBMS_OUTPUT.PUT_LINE('该用户已经存在'); end; -- 声明游标 cursor cursor_name [{parameter[,parameter]...}] [return return_type] is selectSql open cursor_name // 打开游标 fetch cursor_name into variable_list; // 提取游标 close cursor_name // 关闭游标 -- 普通游标取值 declare fname varchar2(20); lname varchar2(20); cursor c_student is select firstname,lastname from student where id = '1001'; begin open c_student; if c_student%NOTFOUND then dbms_output.put_line('没有找到记录'); else fetch c_student into firstname,lastname; dbms_output.put_line(fname||''||lname); end if; close c_student; end; -- loop/while/for 循环取值 declare fname varchar2(20); lname varchar2(20); cursor t_student is select firstnam