訪問oracle
在pl/sql 中只能直接嵌入sql,dml,以及事務控制語句,而不能嵌入ddl語句如create。。和dcl 語句如grant1 檢索單行數據
? 1 使用游標變量接受數據
? declare
??? v_ename emp.ename%type
??? v_sal?? emp.sal%type
? begin
??? select ename,sal into v_ename,v_sal
??? from emp
? 2 使用記錄變量接受數據
?? declare
??? type emp_record_type is record(
????? ename emp.ename%type,sal emp.sal%type
??? );
??? emp_record emp_record_type;
?? begin
??? select ename,sal into emp_record
??? from emp
? 3 嵌入 select 語句注意的事項:語句必須返回一條數據,且只能返回一條數據,否則回觸發例外,或顯示錯誤
??? 1) no_data_found
??? 2) too_many_rows
2 操縱數據
? 1 插入數據
??? 1) 使用values子句插入數據
??? declare
???? v_deptno dept.deptno%type
???? v_dname? dept.dname%type
???? v_deptno:=&no
???? v_dname:=&name;
???? insert into dept(deptno,dname)
???? values(v_deptno,v_danme);
??? 2)使用子查詢插入數據
??? declare
???? v_deptno emp.deptno%type:=no;
??? begin
???? insert into employee
???? select * from emp where deptno=v_deptno
?? 3 更新數據
??? 1)使用表達時更新列值
??? declare
???? v_deptno dept.deptno%type:=&no;
???? v_loc dept.loe%type:='&loc';
??? begin
???? update dept set loc=v_loc
???? where deptno=v.deptno;
??? end;
?? 2) 使用子查詢更新列值
??? declare
???? v_ename emp.ename%type:='&name';
??? begin
???? update emp set(sal,comm)=
???? (select sal ,comm from emp where ename=v_ename)
???? where job=(select job from emp where ename=v_ename);
3 sql 游標
? 1 sql%isopen 用于確定sql 游標是否已經打開。當在pl/sql 塊中執行select into ,update 以及delete 語句
??? 時oracle 會隱含的打開游標,并且在語句執行完之后會隱含的關閉游標。
? 2 sql/%found 用于確定sql 語句執行是否成功。
??? declare
?????? v_deptno emp.deptno%type:=$no;
??? begin
?????? update emp set sal=sal*1.1
?????? where deptno=v_deptno;
??? if sql%found then
?????? dbma_output.put_line('語句執行成功');
??? else
?????? dbms_output.put_line('not success')
??? end if
?? end
?? 3 sql%notfound
?? 4 sql%rowcount 用于返回sql 語句所作用的總計行數
4