游标练习
record類型示例(%type):
set serveroutput on
declare
v_empno emp.empno%type;
type? emp_record is record
(ename? emp.ename%type,
sal???? emp.sal%type,
deptno? emp.deptno%type);
v_emp_rec? emp_record;
begin
? select ename,sal,deptno into v_emp_rec from emp where empno=&v_empno;
? dbms_output.put_line('Employees name is: '||v_emp_rec.ename);
? dbms_output.put_line('Employees salary is: '||v_emp_rec.sal);
? dbms_output.put_line('Employees deptno is: '||v_emp_rec.deptno);
end;
/
declare
? type emp_record is record(ename emp.ename%type, sal emp.sal%type, deptno emp.deptno%type);
? v_emp_rec emp_record;
begin
? select ename, sal, deptno into v_emp_rec from emp where empno = #
? dbms_output.put_line(v_emp_rec.ename || ' ' || v_emp_rec.sal || ' ' || v_emp_rec.deptno);
end;
/
record類型示例(%rowtype)
declare
? v_emp_rec? emp%rowtype;
begin
? select * into v_emp_rec from emp where empno=#
? dbms_output.put_line('Employees name is: '||v_emp_rec.ename);
? dbms_output.put_line('Employees salary is: '||v_emp_rec.sal);
? dbms_output.put_line('Employees deptno is: '||v_emp_rec.deptno);
? dbms_output.put_line('Employees hiredate is: '||v_emp_rec.hiredate);
end;
/
record類型示例(%rowtype),如果日期類型不對,可以用to_char函數轉換
declare
? v_emp_rec? emp%rowtype;
begin
? select * into v_emp_rec from emp where empno=#
? dbms_output.put_line('Employees name is: '||v_emp_rec.ename);
? dbms_output.put_line('Employees salary is: '||v_emp_rec.sal);
? dbms_output.put_line('Employees deptno is: '||v_emp_rec.deptno);
? dbms_output.put_line('Employees hiredate is: '||to_char(v_emp_rec.hiredate,'yyyy-mm-dd'));
end;
/
table類型示例(只有一列數據需要顯示):
SQL> declare
? 2??? type emp_table is table of emp.ename%type index by binary_integer;
? 3??? v_emp_table emp_table;
? 4? begin
? 5??? select ename into v_emp_table(1) from emp where empno = 7788;
? 6??? select ename into v_emp_table(2) from emp where empno = 7369;
? 7??? select ename into v_emp_table(3) from emp where empno = 7499;
? 8??? dbms_output.put_line('Name is: ' || v_emp_table(1));
? 9??? dbms_output.put_line('Name is: ' || v_emp_table(2));
?10??? dbms_output.put_line('Name is: ' || v_emp_table(3));
?11? end;
?12? /
Name is: SCOTT
Name is: SMITH
Name is: ALLEN
PL/SQL procedure successfully completed
table類型示例(有多列數據需要顯示):
declare
? type emp_tab_ename is table of emp.ename%type index by binary_integer;
? type emp_tab_sal is table of emp.sal%type index by binary_integer;
? v_emp_tab_ename emp_tab_ename;
? v_emp_tab_sal?? emp_tab_sal;
begin
? select ename into v_emp_tab_ename(1) from emp where empno = 7788;
? select ename into v_emp_tab_ename(2) from emp where empno = 7369;
? select ename into v_emp_tab_ename(3) from emp where empno = 7499;
? select sal into v_emp_tab_sal(1) from emp where empno = 7788;
? select sal into v_emp_tab_sal(2) from emp where empno = 7369;
? select sal into v_emp_tab_sal(3) from emp where empno = 7499;
? dbms_output.put_line('Name is: ' || v_emp_tab_ename(1) ||' Salary is: ' || v_emp_tab_sal(1));
? dbms_output.put_line('Name is: ' || v_emp_tab_ename(2) ||' Salary is: ' || v_emp_tab_sal(2));
? dbms_output.put_line('Name is: ' || v_emp_tab_ename(3) ||' Salary is: ' || v_emp_tab_sal(3));
end;
/
如果要處理多行多列數據:
在table類型里嵌套record就可以處理多行多列
declare
?type emp_table_type is table of emp%rowtype index by binary_integer;
?v_emp_table_type? emp_table_type;
begin
? select * into v_emp_table_type(1) from emp where empno=7788;
? select * into v_emp_table_type(2) from emp where empno=7369;
? dbms_output.put_line('7788 Ename is: '||v_emp_table_type(1).ename);
? dbms_output.put_line('7788 salary is: '||v_emp_table_type(1).sal);
? dbms_output.put_line('7788 Department is: '||v_emp_table_type(1).deptno);
? dbms_output.put_line('7369 Ename is: '||v_emp_table_type(2).ename);
? dbms_output.put_line('7369 salary is: '||v_emp_table_type(2).sal);
? dbms_output.put_line('7369 Department is: '||v_emp_table_type(2).deptno);
end;
/
DML操作可以同時處理多行
pl/sql里嵌套dml操作(可能影響多行,需注意)
select 默認只能處理單行數據
dml可以處理多行數據
1 插入數據
插入數據示例:
declare
? v_id?? t1.id%type;
? v_name t1.name%type;
? v_dsc? t1.dsc%type;
? t1_rcd t1%rowtype;
begin
? v_id?? := 10;
? v_name := 'tom';
? v_dsc? := 12;
? insert into t1 values (v_id, v_name, v_dsc);
? commit;
? select * into t1_rcd from t1 where id = v_id;
? dbms_output.put_line('T1 record is : ' || t1_rcd.id || ',' ||t1_rcd.name || ',' || t1_rcd.dsc);
end;
/
插入示例:
begin
? insert into t1 select * from t1;
? commit;
end;
/
更新示例:
declare
? v_name t1.name%type := 'rose';
begin
? update t1 set name = v_name where id = 10;
? commit;
end;
/
刪除示例:
declare
? v_id t1.id%type;
begin
? v_id:=10;
? delete from t1 where id=v_id;
? commit;
end;
/
pl/sql中使用事務控制
?DECLARE
?? v_deptno dept.deptno%TYPE := 20;
?BEGIN
?? DELETE FROM dept WHERE deptno = v_deptno;
?? COMMIT;
?EXCEPTION
?? WHEN OTHERS THEN
???? ROLLBACK;
?end;
cursor游標
oracle在執行sql語句時,為sql語句所分配的一個私有的內存區域
當oracle在執行sql,會建立一個cursor(私有的內存區域)??? ?
默認:建立隱式游標(select,一次只能處理一行數據)
隱式游標特點:
1 oracle自動創建
2 自動open
3 數據處理完成自動close
4 select一次只能處理一行數據
隱式游標用于處理select insert? update? delete語句
顯示游標:由開發人員定義,可以通過循環方式處理多行數據(select)
1 開發人員按需定義
2 手工open
3 fetch取值(通過循環讀取數據)
4 手工close
顯示游標用于處理多行select語句
隱式游標:一次只能返回一行結果(不需要定義,默認)
顯示游標:需要用戶提前定義,可以通過循環的方式處理游標里的sql語句,返回多行結果
隱式游標的屬性:
sql%rowcout 統計在游標中處理的記錄數
sql%found?? 如果在游標中能找到符合條件的一條記錄,結果為true
sql%notfound 如果在游標中能找不到符合條件的一條記錄,結果為true
sql%open??? 判斷游標是否打開,在隱式游標中默認游標自動打開
隱式游標的幾個屬性:
truncate table t1;
sql%notfound屬性
declare
? v_id t1.id%type;
begin
? v_id:=10;
? update t1 set id=20 where id=v_id;
? if sql%notfound then
? insert into t1(id) values (v_id);
? commit;
? end if;
end;
/
sql%found屬性
declare
? v_id t1.id%type;
begin
? v_id:=10;
? delete from t1? where id=v_id;
? if sql%found then
? dbms_output.put_line('T1 record is delete!');
? commit;
? end if;
end;
/
轉載于:https://blog.51cto.com/duxiutemp/1875888
總結
- 上一篇: NSObject协议中方法:descri
- 下一篇: Android 蹲坑的疑难杂症集锦一