Oracle PL/SQL-posttyp med exempel
โก Smart sammanfattning
PL/SQL-posttypen รคr en komplex datatyp som grupperar flera kolumner, var och en med sitt eget namn och datatyp, till en ny typ. En post kan definieras pรฅ databasnivรฅ som ett lagrat objekt eller inuti ett underprogram, och dess fรคlt nรฅs med punktoperatorn.

Vad รคr en posttyp?
En posttyp รคr en komplex datatyp som gรถr det mรถjligt fรถr programmeraren att skapa en ny datatyp med รถnskad kolumnstruktur. Dess huvudsakliga egenskaper รคr:
- Den grupperar en eller flera kolumner fรถr att bilda en ny datatyp.
- Var och en av dessa kolumner har sitt eget namn och sin egen datatyp.
- En posttyp kan acceptera data som en enda post bestรฅende av mรฅnga kolumner, eller sรฅ kan den acceptera vรคrdet fรถr en viss kolumn i en post.
- En posttyp รคr helt enkelt en ny datatyp. Nรคr den vรคl skapats lagras den som en ny datatyp och kan anvรคndas fรถr att deklarera en variabel i program.
- Den anvรคnder nyckelordet 'TYP' fรถr att instruera kompilatorn att en ny datatyp skapas.
- Den kan skapas vid databasnivรฅ, lagras som ett databasobjekt och anvรคnds i hela databasen, eller vid delprogramnivรฅ, endast synlig inuti underprogrammet.
- En posttyp pรฅ databasnivรฅ kan ocksรฅ deklareras fรถr tabellkolumner, sรฅ att en enda kolumn kan innehรฅlla komplex data.
- Data nรฅs genom att referera till variabelnamnet, sedan en periodoperator (.) och sedan kolumnnamnet, som ' . '.
Syntax fรถr att deklarera en posttyp
Syntax fรถr deklaration pรฅ databasnivรฅ:
CREATE TYPE <type_name_db> IS RECORD ( <column 1> <datatype>, );
I den fรถrsta syntaxen instruerar nyckelordet 'CREATE TYPE' kompilatorn att skapa posttypen med namnet "type_name_db" med de angivna kolumnerna som ett databasobjekt. Detta ges som ett individuellt kommando, inte inuti nรฅgot block.
Syntax fรถr deklaration pรฅ delprogramnivรฅ:
DECLARE TYPE <type_name> IS RECORD ( <column1> <datatype>, ); BEGIN <execution_section>; END;
I den hรคr syntaxen skapar vi posttypen med namnet "typnamn" endast inuti underprogrammet. I bรฅda metoderna รคr sรคttet att definiera kolumnen och datatypen likartat.
Exempel 1: Posttyp som ett databasobjekt
I det hรคr programmet ser vi hur man skapar en posttyp som ett databasobjekt. Vi skapar posttypen 'emp_det' med fyra kolumner. Kolumnerna och deras datatyper รคr:
- EMP_NO (NUMBER)
- EMP_NAME (VARCHAR2 (150))
- MANAGER (NUMMER)
- LรN (NUMMER)
CREATE TYPE emp_det IS OBJECT ( EMP_NO NUMBER, EMP_NAME VARCHAR2(150), MANAGER NUMBER, SALARY NUMBER ); /
Produktion:
Type created
Code Fรถrklaring
- Ovanstรฅende kod skapar typen emp_det som ett databasobjekt.
- Den har fyra kolumner: anstรคllningsnummer, anstรคllningsnamn, chef och lรถn, enligt definitionen.
- Nu liknar 'emp_det' alla andra data typ (som NUMBER eller VARCHAR2) och รคr synlig i hela databasen. Dรคrfรถr kan den anvรคndas var som helst i databasen fรถr att deklarera en variabel av denna typ.
Exempel 2: Delprogramnivรฅ, รฅtkomst pรฅ kolumnnivรฅ
I det hรคr exemplet ser vi hur man skapar en posttyp pรฅ underprogramnivรฅ och hur man fyller i och hรคmtar vรคrden frรฅn den kolumnvis. Vi skapar posttypen 'emp_det' pรฅ underprogramnivรฅ och anvรคnder den fรถr att fylla i och visa data.
DECLARE TYPE emp_det IS RECORD ( EMP_NO NUMBER, EMP_NAME VARCHAR2(150), MANAGER NUMBER, SALARY NUMBER ); guru99_emp_rec emp_det; BEGIN guru99_emp_rec.emp_no:= 1001; guru99_emp_rec.emp_name:= 'XXX'; guru99_emp_rec.manager:= 1000; guru99_emp_rec.salary:= 10000; dbms_output.put_line('Employee Detail'); dbms_output.put_line ('Employee Number: '||guru99_emp_rec.emp_no); dbms_output.put_line ('Employee Name: '||guru99_emp_rec.emp_name); dbms_output.put_line ('Employee Salary: ' ||guru99_emp_rec.salary); dbms_output.put_line ('Employee Manager Number: '||guru99_emp_rec.manager); END; /
Produktion:
Employee Detail Employee Number: 1001 Employee Name: XXX Employee Salary: 10000 Employee Manager Number: 1000
Code Fรถrklaring
- Code rad 2-8: Posttypen 'emp_det' deklareras med kolumnerna emp_no, emp_name, manager och salary av datatyperna NUMBER, VARCHAR2, NUMBER och NUMBER.
- Code rad 9: Variabeln guru99_emp_rec deklareras som datatypen 'emp_det'. Detta variabel kan innehรฅlla ett vรคrde som innehรฅller alla fyra fรคlt.
- Code rad 11: Fyller pรฅ 'emp_no'-fรคltet fรถr 'guru99_emp_rec' med vรคrdet 1001.
- Code rad 12: Fyller fรคltet 'emp_name' med vรคrdet XXX.
- Code rad 13: Fyll i fรคltet 'chef' med vรคrdet 1000.
- Code rad 14: Fyll i fรคltet 'lรถn' med vรคrdet 10000.
- Code rad 15-19: Visar vรคrdet fรถr 'guru99_emp_rec' i utdata.
Exempel 3: Delprogramnivรฅ, รฅtkomst pรฅ radnivรฅ
I det hรคr exemplet ser vi hur man skapar en posttyp pรฅ underprogramnivรฅ och fyller i den pรฅ radnivรฅ. Vi skapar posttypen 'emp_det' pรฅ underprogramnivรฅ och anvรคnder den fรถr att fylla i och visa data.
DECLARE TYPE emp_det IS RECORD ( EMP_NO NUMBER, EMP_NAME VARCHAR2(150), MANAGER NUMBER, SALARY NUMBER ); guru99_emp_rec emp_det; BEGIN INSERT INTO emp (emp_no, emp_name, salary, manager) VALUES (1002,'YYY',15000,1000); COMMIT; SELECT emp_no, emp_name, salary, manager INTO guru99_emp_rec FROM emp WHERE emp_no=1002; dbms_output.put_line ('Employee Detail'); dbms_output.put_line ('Employee Number: '||guru99_emp_rec.emp_no); dbms_output.put_line ('Employee Name: '||guru99_emp_rec.emp_name); dbms_output.put_line ('Employee Salary: '||guru99_emp_rec.salary); dbms_output.put_line ('Employee Manager Number: '||guru99_emp_rec.manager); END; /
Code Fรถrklaring
- Code rad 2-8: Posttypen 'emp_det' deklareras med kolumnerna emp_no, emp_name, manager och salary av datatyperna NUMBER, VARCHAR2, NUMBER och NUMBER.
- Code rad 9: Variabeln guru99_emp_rec deklareras som datatypen 'emp_det' och kan innehรฅlla alla fyra fรคlt.
- Code rad 11: Fyll tabellen anstรคllning med 1002 som anstรคllningsnummer, YYY som anstรคllningsnamn, 15000 som lรถn och 1000 som chefsnummer.
- Code rad 12: Begรฅr infogningstransaktionen.
- Code rad 13: Fyller variabeln 'guru99_emp_rec' pรฅ radnivรฅ frรฅn urvalsfrรฅgan fรถr anstรคllningsnummer 1002.
- Code rad 15-19: Visar vรคrdet fรถr 'guru99_emp_rec' i utdata.
Produktion:
Employee Detail Employee Number: 1002 Employee Name: YYY Employee Salary: 1000 Employee Manager Number: 15000
Obs: En posttyp kan endast nรฅs pรฅ kolumnnivรฅ nรคr dess vรคrde omdirigeras till valfritt utdatalรคge. Observera att i det hรคr exemplet matchar SELECT-listordningen inte postfรคltordningen, vilket รคr anledningen till att lรถn- och chefsvรคrdena visas omvรคxlande i utdata.
Typer av PL/SQL-poster
Utรถver den programmerardefinierade posten som visas ovan, Oracle erbjuder tvรฅ fรถrankrade posttyper som kopierar sin struktur automatiskt. Genom att anvรคnda dem undviker man att deklarera om kolumner och posten hรฅlls i takt med tabellen eller markรถren den baseras pรฅ.
| Skivtyp | Deklarerad med | Strukturen kommer frรฅn |
|---|---|---|
| Tabellbaserad post | tabellnamn%ROWTYPE | Alla kolumner i en tabell |
| Markรถrbaserad post | markรถrnamn%ROWTYPE | Markรถrens vallista |
| Programmerardefinierad post | TYP โฆ รR POST | Kolumner du listar manuellt |
En %ROWTYPE-post รคr det sรคkraste valet nรคr formen ska fรถlja en tabell eller en markรถren, eftersom en kolumnรคndring registreras automatiskt vid nรคsta kompilering.




