8) Crear el procedimiento ejsqldin indicado al comienzo del ep�grafe 5, y realizar
con �l distintas operaciones de definici�n de datos, observar los resultados y solucionar los problemas que puedan plantearse.
CREATE OR REPLACE PROCEDURE ejsqldin
(instruccion VARCHAR2) AS id_cursor INTEGER; v_dummy INTEGER; BEGIN id_cursor := DBMS_SQL.OPEN_CURSOR; DBMS_SQL.PARSE(id_cursor, instruccion, DBMS_SQL.V7); v_dummy := DBMS_SQL.EXECUTE(id_cursor); DBMS_SQL.CLOSE_CURSOR(id_cursor); EXCEPTION WHEN OTHERS THEN DBMS_SQL.CLOSE_CURSOR(id_cursor); RAISE; END ejsqldin; /
/* Ejemplos de definici�n de datos con ejsqldin */
SQL> EXECUTE EJSQLDIN('CREATE USER DUMM1 IDENTIFIED BY DUMM1')
begin EJSQLDIN('CREATE USER DUMM1 IDENTIFIED BY DUMM1'); end; * ERROR en l�nea 1: ORA-01031: privilegios insuficientes ORA-06512: en "SYSTEM.EJSQLDIN", l�nea 14 ORA-06512: en l�nea 1 SQL> GRANT CREATE USER TO SYSTEM; Concesi�n terminada con �xito.
SQL> EXECUTE EJSQLDIN('CREATE USER DUMM1 IDENTIFIED BY DUMM1')
Name Null? Type ------------------------------- -------- ---- C1 CHAR(1) COMENTARIO VARCHAR2(20)
9.- Crear un procedimiento que permita consultar todos los datos de la tabla depart a partir de una condici�n que se indicar� en la llamada al procedimiento.
CREATE OR REPLACE PROCEDURE consultar_depart
(condicion VARCHAR2, valor VARCHAR2) AS id_cursor INTEGER; v_comando VARCHAR2(2000); v_dummy NUMBER; v_dept_no depart.dept_no%TYPE; v_dnombre depart.dnombre%TYPE; v_loc depart.loc%TYPE; BEGIN id_cursor := DBMS_SQL.OPEN_CURSOR; v_comando := � SELECT dept_no, dnombre, loc FROM depart WHERE � || condicion || �:val_1�; DBMS_OUTPUT.PUT_LINE(v_comando); DBMS_SQL.PARSE(id_cursor, v_comando, DBMS_SQL.V7); DBMS_SQL.BIND_VARIABLE(id_cursor, �:val_1�, valor); /* A continuaci�n se especifican las variables que recibir�n los valores de la selecci�n*/ DBMS_SQL.DEFINE_COLUMN(id_cursor, 1, v_dept_no); DBMS_SQL.DEFINE_COLUMN(id_cursor, 2, v_dnombre,14); DBMS_SQL.DEFINE_COLUMN(id_cursor, 3, v_loc, 14); v_dummy := DBMS_SQL.EXECUTE(id_cursor); /* La funci�n FETCH_ROWS recupera filas y retorna el n�mero de filas que quedan */ WHILE DBMS_SQL.FETCH_ROWS(id_cursor)>0 LOOP /* A continuaci�n se depositar�n los valores recuperados en las variables PL/SQL */ DBMS_SQL.COLUMN_VALUE(id_cursor, 1, v_dept_no); DBMS_SQL.COLUMN_VALUE(id_cursor, 2, v_dnombre); DBMS_SQL.COLUMN_VALUE(id_cursor, 3, v_loc); DBMS_OUTPUT.PUT_LINE(v_dept_no || �*� || v_dnombre || �*� || v_loc); END LOOP; DBMS_SQL.CLOSE_CURSOR(id_cursor); EXCEPTION WHEN OTHERS THEN DBMS_SQL.CLOSE_CURSOR(id_cursor); RAISE; END consultar_depart;