Sunteți pe pagina 1din 4

TEMA A 5-A

Scriei un script a crui funcionare corect s fie verificat pe propria dvs.schem de baze de date care, folosind Dicionarul de Date al ORACLE, s rezolve o anumit sarcin. Posibile sarcini pot fi dar nu se limiteaz la: - scrierea de scripturi care s genereze scripturile de creare pt.triggerele/procedurile sau funciile stocate/pachetele din propria dvs.schem; - scripturi care s duplice funcionalitatea comenzii SQL*Plus DESCRIBE pt.tabele, proceduri/funcii stocate, pachete, triggere. Cerine: - cunoaterea semnificaiei script; - cunoaterea semnificaiei folosite n script. view-urilor cmpurilor folosite din n

view-uri

E:\users\Miklos\Miklos\oracle\my_job.sql

Tuesday, March 08, 2011 8:13 PM

------

Script care primind printr-o variabila de substitutie un nume de tabela genereaza folosind dictionarul de date scriptul de creare a ei si de adaugare a restrictiilor. Pt.simplificare se presupune ca restrictiile lucreaza cu un singur cimp (nu exista chei primare, unice sau externe cu mai mult de un cimp).

set echo off set pagesize 0 set heading off set verify off set feedback off accept s_table_name char prompt "Enter table name " spool create.sql variable b_text varchar2( 4000 ) DECLARE v_cTableName v_cFldDef v_cStmt v_cSrcCol v_cDstCol v_cRefTableName BEGIN -------------------------------- 1.crearea structurii tabelei ------------------------------v_cTableName := '&s_table_name'; -------------------------- definitiile cimpurilor ------------------------v_cStmt := 'CREATE TABLE ' || v_cTableName || CHR( 10 ) || CHR( 9 ) || '(' || CHR( 10 ) || CHR( 9 ); FOR v_raux IN ( SELECT column_name, data_type, data_length, data_precision, data_scale FROM user_tab_columns WHERE table_name = UPPER( v_cTableName ) ) LOOP v_cFldDef := v_raux.column_name || ' '; CASE WHEN v_raux.data_type IN ( 'VARCHAR2', 'NVARCHAR2', 'CHAR', 'NCHAR', 'RAW') THEN v_cFldDef := v_cFldDef || v_raux.data_type || '(' || v_raux.data_length || '),' || CHR( 10 ) || CHR( 9 ); WHEN v_raux.data_type = 'NUMBER' THEN v_cFldDef := v_cFldDef || v_raux.data_type || '(' || v_raux.data_precision ||
-1-

VARCHAR2(20); VARCHAR2(50); VARCHAR2(1000); VARCHAR2(20); VARCHAR2(20); VARCHAR2(20);

E:\users\Miklos\Miklos\oracle\my_job.sql

Tuesday, March 08, 2011 8:13 PM

', ' || v_raux.data_scale || '),' || CHR( 10 ) || CHR( 9 ); ELSE v_cFldDef := v_cFldDef || v_raux.data_type || ',' || CHR( 10 ) || CHR( 9 ); END CASE; v_cStmt := v_cStmt || v_cFldDef; END LOOP; v_cStmt := SUBSTR( v_cStmt, 1, LENGTH( v_cStmt ) -3 ) || CHR( 10 ) || CHR( 9 ) || ');'; dbms_output.put_line( v_cStmt ); --------------------------------------------------------------------------- 2.crearea restrictiilor -- construieste restrictiile una cite una -- restrictiile de tip FK au in coloana R_CONSTRAINT_NAME numele indexului -- asociat restrictiei de PK sau UNIQUE din tabela referita -------------------------------------------------------------------------FOR v_raux IN ( SELECT constraint_name, constraint_type, search_condition, r_constraint_name FROM user_constraints WHERE table_name = UPPER( v_cTableName ) ) LOOP CASE v_raux.constraint_type WHEN 'P' THEN -- cheie primara v_cStmt := 'ALTER TABLE ' || LOWER( v_cTableName ) || ' ADD CONSTRAINT ' || LOWER( v_raux.constraint_name ) || ' PRIMARY KEY ( '; ---------------------------------------- gaseste coloana asociata restrictiei --------------------------------------SELECT column_name INTO v_cSrcCol FROM user_cons_columns WHERE constraint_name = v_raux.constraint_name; v_cStmt := v_cStmt || v_cSrcCol || ' );'; WHEN 'U' THEN -- cheie unica v_cStmt := 'ALTER TABLE ' || LOWER( v_cTableName ) || ' ADD CONSTRAINT ' || LOWER( v_raux.constraint_name ) || ' UNIQUE ( '; ---------------------------------------- gaseste coloana asociata restrictiei --------------------------------------SELECT column_name INTO v_cSrcCol FROM user_cons_columns WHERE constraint_name = v_raux.constraint_name; v_cStmt := v_cStmt || v_cSrcCol || ' );'; WHEN 'R' THEN -- cheie externa v_cStmt := 'ALTER TABLE ' || LOWER( v_cTableName ) || ' ADD CONSTRAINT ' || LOWER( v_raux.constraint_name ) || ' FOREIGN KEY ( ';
-2-

E:\users\Miklos\Miklos\oracle\my_job.sql

Tuesday, March 08, 2011 8:13 PM

---------------------------------------- gaseste coloana asociata restrictiei --------------------------------------SELECT column_name INTO v_cSrcCol FROM user_cons_columns WHERE constraint_name = v_raux.constraint_name; ------------------------------------------------------------- gaseste coloana si tabela referita asociate restrictiei -- pe baza numelui indexului asociat cheii unice sau primare -- din tabela destinatie -----------------------------------------------------------SELECT table_name, column_name INTO v_cRefTableName, v_cDstCol FROM user_ind_columns WHERE index_name = v_raux.r_constraint_name; v_cStmt := v_cStmt || LOWER( v_cSrcCol ) || ' ) REFERENCES ' || LOWER( v_cRefTableName ) || '( ' || LOWER( v_cDstCol ) || ' );'; ELSE -- cheie check( incluzind NOT NULL ) v_cStmt := 'ALTER TABLE ' || LOWER( v_cTableName ) || ' ADD CONSTRAINT ' || LOWER( v_raux.constraint_name ) || ' CHECK( ' || v_raux.search_condition || ' );'; END CASE; dbms_output.put_line( v_cStmt ); END LOOP; END; / spool off set echo on set pagesize 24 set heading on set verify on set feedback on

-3-

S-ar putea să vă placă și