日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

10.PL_SQL——PL_SQL中的复合数据类型之RECORDS

發布時間:2025/3/17 数据库 19 豆豆
生活随笔 收集整理的這篇文章主要介紹了 10.PL_SQL——PL_SQL中的复合数据类型之RECORDS 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一、記錄和集合概述

???????? 目前為止所介紹的變量的數據類型都屬于scalar,即標量,如×××,字符串,日期等等。任何一種編程語言都需要提供一些手段讓用戶創建更復雜的變量,PL/SQL也不例外,本章就來介紹一下PL/SQL中的復合型變量。

?

PL/SQL的復合型變量主要包括兩類:

?

????????????? 1. Records:記錄

????????????? 2. Collection集合。Collection又可以分為三種,

????????????????????????????? a. Associative? ArrayINDEXTBY table: 關聯數組(或稱索引表,和SQL中的INDEX OF TABLE不是一個概念)

????????????????????????????? b. Nested Table: 嵌套表

????????????????????????????? c. Varray: 可變長度列表。

?

二、記錄和集合的區別

???????? Records可以形象的理解為一個容器,用來保存很多其他的數據類型,但每種數據類型只在記錄中出現一次,例如一個記錄中保存了如下數據類型:

?

PL/SQL Record

這個記錄中保存了布爾型、日期型、字符型和BLOB型變量,且每個變量都只出現了一次,每個存放其他數據類型的空間稱為域(Field


SQL> edit

?

DECLARE

??? TYPE myrecord IS RECORD

??????? (id number(8),

??????????? name varchar2(20)default 'Wilson',

??????????? birthday DATE

??????? );?

???????

??????? person myrecord;

BEGIN??

??????? person.id :=12345;

??????? person.birthday :=SYSDATE;

???????

???????DBMS_OUTPUT.PUT_LINE('Name: '|| person.name);

END;???

/

?

SQL> /

Name: Wilson

===============================

SQL> edit

?

DECLARE

??? person employees%ROWTYPE

BEGIN

??? SELECT * INTO person

??? FROM employees WHEREemployee_id = 100;

???

??? DBMS_OUTPUT.PUT_LINE('Name: '|| person.first_name);

END;

/

?

SQL> @notes/s37.sql

Name: Steven

?

PL/SQL procedure successfully completed.

===============================================

eg3.

?

SQL> edit

?

DECLARE

??? TYPE t_rec IS RECORD

??????? (v_sal number(8),

???????? v_minsal number(8)default 1000,

???????? v_hire_dateemployees.hire_date%TYPE,

???????? v_reclemployees%ROWTYPE);

??? v_myrec t_rec;

BEGIN

??? v_myrec.v_sal := v_myrec.v_minsal+ 500;

??? v_myrec.v_hire_date :=SYSDATE;

??? SELECT * INTO v_myrec.v_recl

??? FROM employees WHEREemployee_id = 100;

???DBMS_OUTPUT.PUT_LINE(v_myrec.v_recl.last_name || ' ' ||???? TO_CHAR(v_myrec.v_hire_date) || ' '||???? TO_CHAR(v_myrec.v_sal));

END;

/

?

SQL> @notes/s38.sql

King 24-AUG-14 1500

?

PL/SQL procedure successfully completed.

CREATE TABLE retired_emps (

??????? EMPNO NUMBER(4),

??????? ENAME VARCHAR2(25),

??????? JOB?? VARCHAR2(9),

??????? MGR?? NUMBER(4),

??????? HIREDATE DATE,

??????? LEAVEDATE DATE,

??????? SAL?? NUMBER(7,2),

??????? COMM? NUMBER(7,2),

??????? DEPTNO NUMBER(2)

??? );

?

SQL> @notes/s39.sql

?

Table created.

?

SQL> select * from retired_emps where empno = 124;

?

no rows selected

?

SQL> edit

?

DECLARE

??? v_employee_number NUMBER :=124;

??? v_emp_rec?? employees%ROWTYPE;

BEGIN

??? SELECT * INTO v_emp_rec FROMemployees

??? WHERE employee_id =v_employee_number;

?

??? INSERT INTOretired_emps(empno, ename, job, mgr,

??????????????? hiredate,leavedate, sal, comm, deptno)

??? VALUES( v_emp_rec.employee_id,v_emp_rec.last_name,

??????????? v_emp_rec.job_id,v_emp_rec.manager_id,

??????????? v_emp_rec.hire_date,SYSDATE,

??????????? v_emp_rec.salary,v_emp_rec.commission_pct,

???????????v_emp_rec.department_id);

??? COMMIT;

END;

/

?

SQL> @notes/s40.sql

?

PL/SQL procedure successfully completed.

?

SQL> select * from retired_emps where empno = 124;

?

EMPNO ENAME???????? JOB????????????? MGR HIREDATE? LEAVEDATE? SAL?? ????COMM????DEPTNO

---------- ----------????? --------------- --------- ------------------- ---------????? ---------- ---------- ----------

?????? 124 Mourgos??? ?ST_MAN?????100?? ?16-NOV-07?24-AUG-14?5800??????????????????? 50



=========================INSERT============================


SQL> edit

?

DECLARE

??? v_employee_number NUMBER := 127;

??? v_emp_rec retired_emps%ROWTYPE;

?

BEGIN

??? SELECT employee_id, last_name, job_id,manager_id,

??? hire_date, hire_date, salary,commission_pct,

??? department_id INTO v_emp_rec

??? FROM employees

??? WHERE employee_id = v_employee_number;

?

??? INSERT INTO retired_emps

??? VALUES v_emp_rec;

??????????????? -- 將查詢結果打包到v_emp_rec

END;

/

?

SELECT * FROMretired_emps;

?

SQL>@notes/s41.sql

?

PL/SQL proceduresuccessfully completed.

?

?

???? EMPNO ENAME?????? JOB????????MGR ??HIREDATE? LEAVEDATE?SAL?????? COMM???? DEPTNO

----------------------------------- --------- ---------- --------- --------- -------------------- ----------

?????? 124 Mourgos??????? ST_MAN?100? ?16-NOV-07 ?24-AUG-14??5800??????? 50

?????? 127 Landry?????????? ST_CLERK? 120 ?14-JAN-07??14-JAN-07???? 3200???????50

?

=========================UPDATE============================

?

SQL> edit

?

SET VERIFY OFF

DECLARE

??????? v_employee_number NUMBER:= 127;

??????? v_emp_recretired_emps%ROWTYPE;

?

BEGIN

??????? SELECT *

??????? INTO v_emp_rec

??????? FROM retired_emps

??????? WHERE empno =v_employee_number;

??????? v_emp_rec.leavedate :=CURRENT_DATE;

?

??????? UPDATE retired_emps SETROW = v_emp_rec

???? ???WHERE empno = v_employee_number;

END;

/

?

SELECT * FROM retired_emps;

?

?

SQL> @notes/s42.sql

?

PL/SQL procedure successfully completed.

?

?

???? EMPNO ENAME??? ?JOB????????????? MGR HIREDATE? LEAVEDATE?????SAL?????? COMM???? DEPTNO

???? ---------- --------------? ---------- --------- ---------- ------------------?? ?---------- ---------- ----------

?????? 124 Mourgos????? ST_MAN????? 100 16-NOV-07 24-AUG-14?????5800??????????????? ???????50

?????? 127 Landry??????? ST_CLERK????? 120 14-JAN-07 24-AUG-14????? 3200??????????????????? 50



SQL> edit

?

DECLARE

??? myrec employees%ROWTYPE;

BEGIN

??? myrec := NULL;

END;

/

?

SQL> @notes/s43.sql

?

PL/SQL procedure successfully completed.


轉載于:https://blog.51cto.com/wuyelan/1550342

總結

以上是生活随笔為你收集整理的10.PL_SQL——PL_SQL中的复合数据类型之RECORDS的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。