Documente online.
Zona de administrare documente. Fisierele tale
Am uitat parola x Creaza cont nou
 HomeExploreaza
upload
Upload




INTRODUCCION A ORACLE: SQL Y PL/SQL

software


TEST 1 INTRODUCCION A ORACLE: SQL Y PL/SQL

TEMARIO



RDBMS/ORDBMS

USOS Y BENEFICIOS DE PL/SQL

DIFERENCIA ENTRE SENTENCIAS SQL/COMANDOS SQL PLUS

FUNCIONES DISPONIBLES EN SQL

EQUALITY/NONEQUALITY/OUTER JOINS

FUNCIONES DE GRUPO(GROUP BY/HAVING)

SUBQUERIES

SENTENCIAS DML (INSERT/UPDATE/DELETE/CONTROL TRANSACTIONS)

CREACION Y MANEJO DE TABLAS

10. CONSTRAINTS

11. CREACION/EXPLOTACION VISTAS

12. DICCIONARIO DE DATOS

13. OBJETOS DE BASE DE DATOS 20220w222u

14. SEGURIDAD - CONTROL DE ACCESO DE USUARIOS(GRANT/REVOKE)

15. DECLARACION DE VARIABLES,EJECUCION BLOCKS DE PL/SQL

16. DECLARACION DE DATATYPE

17. ESTRUCTURAS DE CONTROL (IF/FOR)

18. ARRAY/VARRAY

19. CREACION DE REGISTROS/TABLA DE REGISTROS/%ROWTYPE

20. CURSORES (IMPLICITOS/EXPLICITOS)(PARAMETROS EN CURSORES/FOR UPDATE)

21. EXCEPCIONES

22. SENTENCIAS LOOP

23. SQL DINAMICO

RDBMS: El Sistema de Administación de Bases Relacionales es una herramienta standard para de Administración de Negocios. Proporciona rapidez, eficiencia, accesos confiables a enorme cantidad de datos.

ORDBMS: Es un Objeto de RDBMS, lo cual significa que los usuarios pueden definir tipos de datos adicionales y usarlos sin el modelo relacional. Este método agrega valor al dato almacenado en la Base. Los tipos de datos definidos por el usuario facilitan el desarrollo de aplicaciones para trabajar con datos complejos como imágenes, audio y video.

USOS Y BENEFICIOS DE PL/SQL

Soporta SQL, mejor performance, mayor productividad, total integración con ORACLE, seguridad. Bloques de PL/SQL pueden ser enviados por una aplicación a la base de datos ejecutando operaciones complejas sin excesivo tráfico en la red.

DIFERENCIA ENTRE SENTENCIAS SQL/COMANDOS SQL PLUS

La diferencia entre las sentencias SQL y los comandos SQL/PLUS radica en que las sentencias SQL trabajan sobre objetos de la Base de Datos mientras que los comandos también controlan el manejo de SQL/PLUS.

COMANDOS SQL/PLUS:

@,/,append,atribute, break, change, clear, compute, connect, copy, define, del, disconnect, edit, exit, run, save, store, etc.

Comandos prompt,accept,pause(comunicación con el usuario)

SQL> CLEAR BUFFER;

buffer cleared

SQL> INPUT

PROMPT INGRESE UN TITULO DE MAS DE 30 CARACT.DE LONG.

ACCEPT MITITULO PROMPT 'TITULO: '

3 TTITLE LEFT MITITULO SKIP 2

4 SELECT * FROM SGP.SP02

5

SQL> SAVE PROMPT1

Created file PROMPT1

SQL> START PROMPT1

INGRESE UN TITULO DE MAS DE 30 CARACT.DE LONG.

TITULO: ES UNA PRUEBA DEL COMANDO PROMPT

ES UNA PRUEBA DEL COMANDO PROMPT

CLAVE TITULO1

PRESUPUESTO DEPARTAMENTO DE CONTABILIDAD

ATENPROV SERVICIO ADMINISTRATIVO FINANCIERO

-UTILIZANDO &&-

1 SELECT MIN(&&NUMBER_COL) MINIMO,

2 SUM(&&NUMBER_COL) TOTAL,

3* AVG(&&NUMBER_COL) PROMEDIO FROM &&TABLA

SQL> /

old 1: SELECT MIN(&&NUMBER_COL) MINIMO,

new 1: SELECT MIN(NRO_RENGLON) MINIMO,

old 2: SUM(&&NUMBER_COL) TOTAL,

new 2: SUM(NRO_RENGLON) TOTAL,

old 3: AVG(&&NUMBER_COL) PROMEDIO FROM &&TAB

new 3: AVG(NRO_RENGLON) PROMEDIO FROM SGP.SP

MINIMO TOTAL PROMEDIO

1 50047 22,6354591

SQL> UNDEFINE NUMBER_COL --borra la definición de la variable NUMBER_COL

SQL> ED

Wrote file afiedt.buf

1 SELECT MIN(&&NUMBER_COL) MINIMO,

2 SUM(&&NUMBER_COL) TOTAL,

3* AVG(&&NUMBER_COL) PROMEDIO FROM &&TABLA

SQL> /

Enter value for number_col: --pide datos nuevamente porque se borró la variable NUMBER_COL, si no fuera así, tomaría los datos almacenados con anterioridad porque tiene &&

INPUT

PROMPT INGRESE UNA CLAVE VALIDA

PROMPT COMO POR EJEMPLO ATENPROV

ACCEPT VARIABLE VARCHAR2 'CLAVE : '

SELECT * FROM SGP.SP02

WHERE CLAVE = &VARIABLE

SQL> SET LINES 3000

SQL> START PROMPT2

INGRESE UNA CLAVE VALIDA

COMO POR EJEMPLO ATENPROV

SP2-0003: Ill-formed ACCEPT command starting as VARCHAR2 'CLAVE : '

Enter value for variable: 'PRESUPUESTO'

old 2: WHERE CLAVE = &VARIABLE

new 2: WHERE CLAVE = 'PRESUPUESTO'

CLAVE TITULO1 T

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

PRESUPUESTO DEPARTAMENTO DE CONTABILIDAD D

Para displayar un mensaje en la pantalla del usuario y tener la confirmación(enter) del usuario hay que utilizar el comando PAUSE

EJ.

SQL> CLEAR BUFFER

buffer cleared

SQL> INPUT

1 PROMPT INGRESE UNA CLAVE VALIDA

2 PROMPT COMO POR EJEMPLO ATENPROV

3 PAUSE PRESIONE ENTER PARA CONTINUAR

4 ACCEPT VARIABLE VARCHAR2 'CLAVE : '

SELECT * FROM SGP.SP02

6 WHERE CLAVE = &VARIABLE

7

SQL> SAVE PROMPT2 REPLACE

Wrote file PROMPT2

SQL> START PROMPT2

INGRESE UNA CLAVE VALIDA

COMO POR EJEMPLO ATENPROV

PRESIONE ENTER PARA CONTINUAR

'PRESUPUESTO'

SP2-0003: Ill-formed ACCEPT command starting as VARCHAR2 'CLAVE : '

Enter value for variable: 'PRESUPUESTO'

old 2: WHERE CLAVE = &VARIABLE

new 2: WHERE CLAVE = 'PRESUPUESTO'

CLAVE TITULO1

PRESUPUESTO DEPARTAMENTO DE CONTABILIDAD

SQL>

BIND VARIABLES

Son variables que se crean en SQL PLUS y se utilizan en PL/SQL.

Pueden ser usadas como si hubiesen sido declaradas en su PL/SQL SUBPROGRAM y acceder la variable desde SQL PLUS. Como son reconocidas por SQL PLUS se pueden displayar sus valores en SQL PLUS o referenciarlos en otro PL/SQL SUBPROGRAM que se corra en SQL PLUS. Para crearlas: VARIABLE var number

Para referenciarlas :var

Para ver el contenido de var PRINT var

Ej.

SQL> begin

2 :var:=25;

3 end;

4 /

PL/SQL procedure successfully completed.

SQL> print :var

VAR

25

REFCURSOR Bind Variables

SQL> VARIABLE VAR1 REFCURSOR--defino la bind variable

SQL> CLEAR BUFFER

buffer cleared

SQL> INPUT

1 BEGIN

2 OPEN :VAR1 FOR SELECT * FROM SGP.SP02;

3 END;

4 /

PL/SQL procedure successfully completed.

SQL> PRINT VAR1

CLAVE TITULO1 TITULO2

PRESUPUESTO DEPARTAMENTO DE CONTABILIDAD DIVISION P

ATENPROV SERVICIO ADMINISTRATIVO FINANCIERO ATENCION A

LA ESTRUCTURA PRINT CIERRA EL CURSOR

FUNCIONES DISPONIBLES EN SQL

En SQL existen: -Funciones numéricas: abs,mod,floor,sign,ceil,round,trunc.

-Funciones de tipo Carácter: concat, lpad, rpad, replace,

upper, lower, ltrim, rtrim, substr, instr, length, etc.

-Funciones Date: add_months, next_day, last_day, sysdate, trunc,

months_between, round.

-Funciones de Conversión: to_char, to_number, to_date.

-Funciones agregadas: avg, count, max, min, sum, stddev, variance.

CEIL(15,7)---RETORNA 16

FLOOR(15,7)--RETORNA 15

EQUALITY/NONEQUALITY/OUTER JOINS

EQUALITY JOIN.

--SELECCIONA DE TODAS LAS O/C DE ESE NNE, LA DE MAXIMA FECHA_ORDEN

SELECT A1.NRO_ORDEN,A1.ANIO_ORDEN,

NRO_PEDCOT,ANIO_PEDCOT FROM COMPRAS.CO50 A1,COMPRAS.CO51 A2

WHERE A1.NRO_ORDEN=A2.NRO_ORDEN AND

A1.ANIO_ORDEN=A2.ANIO_ORDEN AND

A2.NNE = 8910290813279 AND

A1.FECHA_ORDEN=(SELECT MAX(FECHA_ORDEN) FROM COMPRAS.CO50 A3

WHERE EXISTS(SELECT * FROM COMPRAS.CO51 A4

WHERE A4.NNE = 8910290813279 AND

A4.NRO_ORDEN=A3.NRO_ORDEN AND

A4.ANIO_ORDEN=A3.ANIO_ORDEN));

ANTI-JOIN.

SELECT * FROM EMP

WHERE DEPTNO NOT IN (SELECT DEPTNO FROM DEPT

WHERE LOC='BOSTON');

SEMI-JOIN.

SELECT * FROM DEPT

WHERE EXISTS (SELECT * FROM EMP

WHERE DEPT.ENAME=EMP.ENAME AND

EMP.BONUS > 5000);

SELF-JOIN.

SELECT A1.ENAME,A2.ENAME FROM EMP A1, EMP A2

WHERE A1.MGR=A2.EMPNO;

OUTER-JOIN.

SELECT A2.NRO_SIDIF,A1.NRO_PROV,A1.FECHA_RECEPCION FROM A1.SP50,A2.SP60

WHERE A1.LETRA_EXPEDIENTE= A2.LETRA_EXPEDIENTE(+) AND

A1.NRO_EXPEDIENTE= A2.NRO_EXPEDIENTE(+) AND

A1.NRO_REGISTRO= A2.NRO_REGISTRO(+); --Con el signo(+) trae todas las columnas del join (si no tienen datos les mueve null).

FUNCIONES DE GRUPO(GROUP BY/HAVING)

SELECT DEPTNO,MIN(SAL),MAX(SAL) FROM EMP

WHERE JOB='CLERK'

GROUP BY DEPTNO

HAVING MIN(SAL) < 1000;--SELECCIONA MIN/MAX SALARIO PARA EMPLEADOS EN C/DEPTO. CUYO SALARIO MINIMO SEA < 1000

EJ.

SELECT E1.NAME,E1.SAL

FROM EMP E1,DEPT, EMP E2

WHERE E1.DEPTNO=DEPT.DEPTNO AND

E1.DEPTNO=E2.DEPTNO

GROUP BY E1.NAME,E1.SAL

HAVING E1.SAL=MIN(E2.SAL); --RESTRIGE LOS GRUPOS DE FILAS PARA LOS CUALES LA CONDICION ES VERDADERA. SI SE OMITE, ORACLE RETORNA LA SUMATORIA DE FILAS DE TODOS LOS GRUPOS (AFECTA A LOS CAMPOS DEL GROUP BY)

SUBQUERIES

UPDATE SGP.SP50 SET DESTINO_UC=DESTINO_UC

WHERE OPERACION='COM' AND IMPORTE > 0 AND

'N' = (SELECT RAE FROM SGP.SP20

WHERE SGP.SP20.FUENTE_FINANC = SGP.SP50.FUENTE_FINANC) AND

TRUNC(FECHA_RECEPCION,'MONTH')='01/01/2001';

SENTENCIAS DML (SELECT/INSERT/UPDATE/DELETE).

EJ.

SELECT * FROM EMP;

INSERT INTO EMP VALUES(1234,'DAVIS',7698);

UPDATE EMP SET NOMBRE='DAVID';

DELETE FROM EMP WHERE NOMBRE='DAVID';

HIERARCHICAL QUERY CLAUSE

SELECT LPAD(' ',2*(LEVEL-1))||ENAME ORG.CHART,EMPNO,MGR,JOB

FROM EMP

START WITH JOB='PRESIDENT' --INDICA LA FILA PPAL.

CONNECT BY EMPO=MGR;--DETERMINA LA RELACION ENTRE PADRES/HIJOS

SENTENCIAS DDL(CREATE/ALTER/DROP/RENAME/TRUNCATE/

ANALYZE/GRANT/REVOKE/AUDIT/NOAUDIT).

Las sentencias DDL poseen commit implícito.

EJ.

CREATE TABLE.SPXXX.(NAME VARCHAR2(10),NRO NUMBER(2));

DROP TABLE SPXXX;

DROP VIEW VIEW_DATA;--VIEW_DATA ES UNA VISTA

GRANT SELECT ON SPXXXX TO SCOTT; -- SCOTT ES UN USUARIO

REVOKE DELETE ON SPXXXX FROM SCOTT;

ALTER TABLE SP100_RESPONSABLES ADD EJERCICIO NUMBER(4);

ALTER TABLE SP100_RESPONSABLES MODIFY EJERCICIO NUMBER(4) NOT NULL;

ALTER TABLE SP100_RESPONSABLES DROP CONSTRAINT SP100_PKEY;

ALTER TABLE SP100_RESPONSABLES ADD CONSTRAINT SP100_PKEY

PRIMARY KEY (EJERCICIO,DESTINO_UC);

TRUNCATE TABLE SP100_RESPONSABLES --BORRA LA TABLA MANTENIENDO PRIV.GRANTEOS,CONSTRAINTS.

CONTROL TRANSACTIONS.

EJ.

COMMIT;

ROLLBACK;

SAVEPOINT UPDATE_SP10;(Setea un punto al cual se puede realizar un rollback)

UPDATE SGP.SP10 SET IMPORTE=1000

WHERE NRO_PROV=1546;

ROLLBACK TO SAVEPOINT UPDATE_SP10;(VUELVE ATRÁS EL UPDATE DE SP10).

SET TRANSACTION.;(Establece propiedades para una transacción. Afecta sólo a la corriente transacción, no a otros usuarios ni otras transacciones. La transacción finaliza con una sentecia COMMIT o ROLLBACK).

SET TRANSACTION READ ONLY;

SET TRANSACTION READ WRITE;

SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;

SET TRANSACTION ISOLATION LEVEL READ COMMITTED;

SET TRANSACTION USE ROLLBACK SEGMENTE ...;

SESSION CONTROL.

EJ.

ALTER SESSION.Especifica o modifica condiciones o parámetros que afecten su conexión a la Base. Las especifiaciones son válidas hasta la desconexión.

ALTER SESSION ENABLE COMMIT IN PROCEDURE;

ALTER SESSION ENABLE PARALLEL DML;

ALTER SESSION ADVISE COMMIT;

ALTER SESSION ADVISE ROLLBACK;

ALTER SESSION ADVISE NOTHING;

SET ROLE .Habilita/Deshabilita roles para la sesión corriente.

SET ROLE RPRESUP IDENTIFIED BY usu_sgp;--Habilita el rol RPRESUP con la password usu_sgp para la corriente sesión.

SET ROLE ALL;-- Habilita todos los roles para la corriente sesión.

SET ROLE ALL EXCEPT BANKER;-- Habilita todos los roles para la corriente sesión excepto el rol banker.

SET ROLE NONE;--Deshabilita todos los roles para la sesión corriente, incluyendo el rol por default.

CREACION Y MANEJO DE TABLAS

CREATE TABLE HT0517_CONCEPTOS_VALIDACION (

MATRICULA NUMBER(7) NOT NULL,

CONCEPTO NUMBER(4) NOT NULL,

FECHA_DESDE DATE NOT NULL,

FECHA_HASTA DATE NOT NULL,

CARGO_REINTEGRO NUMBER(1), -- 1=NORMAL, -1=CARGO/REINTEGRO

CANTIDAD NUMBER(10,2),

VALOR_UNITARIO NUMBER(10,2),

IMPORTE NUMBER(12,2),

NIVEL NUMBER(3),

TIPO NUMBER(2),

NRO_RENGLON NUMBER(4),

USUARIO VARCHAR2(20),

FECHA_ULT_MOD DATE,

--> CONSTRAINTS

CONSTRAINTS

CONSTRAINT HC051701 CHECK (FECHA_HASTA >= FECHA_DESDE),

CONSTRAINT HC051702 CHECK (CARGO_REINTEGRO IN (1, -1)));

CONSTRAINT HY1103 PRIMARY KEY (GRUPO_PAGO, CONCEPTO, FECHA_DESDE)

CONSTRAINT HK110301 FOREIGN KEY (GRUPO_PAGO) REFERENCES HT0121 (GRUPO_PAGO),

CONSTRAINT SP25_UKEY UNIQUE (NRO_PROV),

CREATE SYNONYM HT0311 FOR HT0311_CONC_LIQUIDAR_MANIOBRA;

GRANT INSERT ON SP69 TO RPRESUP;

GRANT SELECT ON SP69 TO RPRESUP;

GRANT DELETE ON SP69 TO RPRESUP;

CREACION/EXPLOTACION VISTAS

CREATE VIEW EMPLEADOS(EMPNO,ENAME,JOB,MGR,HIREDATE,SAL,COMM,DEPTNO) AS

SELECT EMPNO,ENAME,JOB,MGR,HIREDATE,SAL,COMM,DEPTNO FROM EMP1

UNION

SELECT EMPNO,ENAME,JOB,MGR,HIREDATE,SAL,COMM,DEPTNO FROM EMP2;

DICCIONARIO DE DATOS

Es un conjunto de tablas de sólo lectura que provee información acerca de su base de datos asociada. Contiene: -Definición de objetos del esquema en la base (tablas, vistas, índices, clusters, sinónimos, secuencias, procedimientos, funciones, paquetes, triggers). -Cuánto espacio ha sido alocado por los objetos y cuánto es utilizado por ellos. -Valores por default para las columnas.

-Información de los constraints de integridad. -Nombre de usuarios de Oracle.

-Privilegios y roles para cada usuario que haya sido granteado.

El Diccionario de Datos se crea cuando se crea la Base. Oracle lee en él para verificar que el objeto del esquema exista y que el usuario tenga las propiedades de acceso a él. Está contenido en el tablespace SYSTEM, el cual siempre está en línea. En la tabla DBA_ROLLBACK_SEGS del diccionario, se encuentra la información de cada segmento de rollback. Oracle lo modifica cada vez que una sentencia DDL es ejecutada. Puede ser consultado por cualquier usuario Oracle como referencia de sólo lectura.

Para acceder a las vistas del Diccionario, el usuario lo hace a través de SQL. Algunas vistas están disponibles para todos los usuarios, otras sólo para el DBA. Los prefijos de las vistas son: USER(vistas del usuario-en su esquema)

ALL(vistas expandidas del usuario)

DBA(vistas del DBA)

-Consultas al Diccionario de Datos

Prefijo USER

SELECT OBJECT_NAME, OBJECT_TYPE FROM USER_OBJECTS; --Objetos contenidos en el esquema del usuario.

Prefijo ALL

SELECT OWNER, OBJECT_NAME, OBJECT_TYPE FROM ALL_OBJECTS; --Todos los objetos a los cuales tiene acceso contenidos en el esquema del usuario.

Prefijo DBA

Los sinónimos no son creados para estas vistas, porque deben ser consultadas sólo por el Administrador. Por lo tanto, para consultarlas los DBA deben prefijarlas con su dueño, SYS.

SELECT OWNER, OBJECT_NAME, OBJECT_TYPE FROM SYS.DBA_OBJECTS;

SELECT DATA_OBJECT_ID FROM DBA_OBJECTS

WHERE OWNER='SCOTT' AND OBJECT_NAME='EMP';--Retorna el nº de objetos de datos para la tabla EMP en el esquema SCOTT.

SELECT TRIGGER_NAME,STATUS FROM USER_TRIGGERS;

OBJETOS DE BASE DE DATOS 20220w222u

Asociado con cada usuario de base de datos está el Esquema. Un esquema es una colección de objetos de esquema(estructuras lógicas que directamente referencian a datos de la base) tales como tablas, secuencias, store_procedures, sinónimos, índices, clusters, database links, snapshots, procedimientos, funciones y paquetes.

-Tabla. Es la únidad básica de almacenamiento de datos en una base Oracle. Posee filas y columnas. Cada tabla es definida con un nombre y un conjunto de columnas. Cada columna tiene un nombre, un datatype y una longitud.

-Secuencia. Genera una lista de números únicos para columnas numéricas de una tabla. Los números de secuencia son independientes de las tablas. Después de la creación una secuencia puede ser accedida por varios usuarios para generar números actuales de secuencia.

-Procedimiento o función. Conjunto de estructuras SQL y PL/SQL agrupadas en una unidad ejecutable para realizar tareas específicas. Las funciones retornan un valor, los procedimientos no.

-Sinónimo. Es un alias para tablas, vistas, secuencias o unidades de programas. No es un objeto de esquema por sí mismo, pero es una referencia directa a éste.

Son usados para enmarcar el verdadero nombre y dueño del objeto del esquema. Provee accesos públicos, simplifica las sentencias SQL.

-Indices. Son estructuras opcionales asociadas con tablas los cuales son creados para incrementar la performance en la recuperación de datos. Son creados en una o más columnas de una tabla. Son mantenidos y usados automáticamente por Oracle. Los cambios a los datos de la tabla son automáticamente incorporados a los índices pertinentes con completa transparencia para el usuario.

SEGURIDAD - CONTROL DE ACCESO DE USUARIOS(GRANT/REVOKE)

PRIVILEGIOS

El privilegio es un derecho a ejecutar un tipo de sentencia sql.Algunos privilegios incluyen: -derecho de conexión a la base(create a session)

-derecho a crear una tabla en su esquema

-derecho a seleccionar filas de alguna tabla

-derecho a ejecutar algún store_procedure

Existen privilegios de sistema y privilegios de objetos, éstos últimos permiten a los usuarios ejecutar una acción particular sobre un objeto específico(tablas,vistas,secuencias,procedimientos,funciones,paquetes,etc.).

El granteo a objetos también afecta a su sinónimo. Si se dropea el sinónimo, sus granteos quedan sin efecto.

GRANTEO DE PRIVILEGIOS

Los privilegios son granteados a usuarios para que puedan acceder y modificar datos en la base. Un usuario puede recibir un privilegio de dos maneras diferentes:

-Granteados a usuarios explícitamente.

Ej.

GRANT SELECT ON EMP TO SCOTT; -- SCOTT ES UN USUARIO

-Granteados a roles(grupos de privilegios) y entonces el rol es granteado a uno o más usuarios.

--OBJECT PRIVILEGES

Ej.

GRANT INSERT ON SP69 TO RPRESUP; -- RPRESUP ES UN ROL

GRANT ALL ON SP69 TO AGUSTINA; --GRANTEA DELETE,INSERT,SELECT,UPDATE AL USUARIO

REVOKE DELETE ON SP69 FROM AGUSTINA;--REVOCA EL PRIVILEGIO DE DELETE

REVOKE ALL ON SP69 FROM AGUSTINA;

GRANT ALL ON BONUS TO JONES WITH GRANT OPTION--El usuario Jones puede ejercitar todos los privilegios de la Tabla Bonus y Grantear algún privilegio de ésta a otros usuarios o roles.

GRANT SELECT,UPDATE ON CUTE TO PUBLIC;--GRANTEA LA VISTA CUTE A TODOS LOS USUARIOS

REVOKE UPDATE ON CUTE FROM PUBLIC;--REVOCA EL PRIVILEGIO DE LA VISTA A TODOS LOS USUARIOS

--SYSTEM PRIVILEGES

EJ.

GRANT CREATE ANY LIBRARY TO SGP WITH ADMIN OPTION.

GRANT CREATE ANY PROCEDURE TO SGP WITH ADMIN OPTION.

GRANT CREATE ANY SEQUENCE TO SGP WITH ADMIN OPTION.

GRANT CREATE ANY SYNONYM TO SGP WITH ADMIN OPTION.

GRANT EXECUTE ANY LIBRARY TO SGP WITH ADMIN OPTION.

GRANT PROCEDURE TYPE TO SGP.

GRANT LIBRARY TYPE TO SGP.

GRANT CREATE TYPE TO SGP.

15. DECLARACION DE VARIABLES,EJECUCION BLOCKS DE PL/SQL

16. DECLARACION DE DATATYPE

ESTRUCTURAS DE CONTROL (IF/FOR)

IF.. THEN . ELSE..END IF;

FOR I IN 1..VAR LOOP

...

END LOOP;

WHILE :SYSTEM.LAST_RECORD = 'FALSE'

LOOP

WRECORD := TO_NUMBER(:SYSTEM.CURSOR_RECORD);

WNRO_PROVE := :ST15_PROVE_INVITADOS.NRO_PROVE;

WNRO_BENEF := :ST15_PROVE_INVITADOS.NRO_BENEF;

FIRST_RECORD;

LOOP

IF WNRO_PROVE = :ST15_PROVE_INVITADOS.NRO_PROVE AND

WNRO_BENEF = :ST15_PROVE_INVITADOS.NRO_BENEF AND

WRECORD <> TO_NUMBER(:SYSTEM.CURSOR_RECORD) THEN

WEXISTE:=1;

END IF;

IF :SYSTEM.LAST_RECORD = 'TRUE' OR WEXISTE = 1 THEN

EXIT;

END IF;

NEXT_RECORD;

END LOOP;

IF WEXISTE = 1 THEN

CLEAR_MESSAGE;

MESSAGE ('PROVEEDOR YA INTEGRA LA LISTA');

WEXISTE := 0;

RAISE FORM_TRIGGER_FAILURE;

END IF;

WEXISTE := 0;

GO_RECORD(WRECORD + 1);

WRECORD := TO_NUMBER(:SYSTEM.CURSOR_RECORD);

END LOOP;

ARRAY/VARRAY

Es un conjunto ordenado de datos de un mismo tipo. Cada elemento tiene un índice el cual es el número correspondiente a la posición en el array. El número de elementos en el array es la longitud del array. Oracle permite arrays de longitud variable los cuales se llaman varrays. Se debe especificar la longitud máxima cuando se declara el array. Inicialmente el varray es nulo.

CREATE TYPE PRICES AS VARRAY(10) OF NUMBER(12,2);

El varray de prices no tiene más de 10 elementos cada uno de tipo number(12,2).

DECLARE

TYPE NUMEROS IS VARRAY(10) OF NUMBER(3);

NRO NUMEROS;

I NUMBER(3):=9;

BEGIN

NRO:=NUMEROS(10,2,3,4,5,8,6,9,20,100);

DBMS_OUTPUT.PUT_LINE(TO_CHAR(NRO(I)));

--LA SALIDA SERA 20

END;

OTROS TIPOS DE DECLARACION DE VARRAY.

TYPE CALENDARIO IS VARRAY(365) OF DATE; --BASADO EN DATE

CURSOR C1_DEPT IS

SELECT * FROM DEPT;

TYPE LISTA_EMP IS VARRAY(20) OF C1_DEPT%ROWTYPE; --BASADO EN UN CURSOR

TYPE REG IS RECORD(

CAMPO1 VARCHAR2(20),

CAMPO2 VARCHAR2(40));

TYPE GLOSARIO IS VARRAY(250) OF REG; --BASADO EN UN REGISTRO

NESTED_TABLE:

CREATE TYPE AGU AS TABLE OF TABLA;

TYPE AGU IS TABLE OF TABLA;

CREACION DE REGISTROS/TABLA DE REGISTROS/%ROWTYPE

Un registro es un grupo de items de datos relacionados entre sí almacenados en campos cada uno de los cuales tiene nombre y datatype. Los registros facilitan la organización y representación de la información.

El atributo %ROWTYPE permite declarar un registro que representa un fila en la tabla de base de datos.

A diferencia de tablas y varrays, los registros no pueden ser creados y almacenados en la base.

Creación de Registros.

EJ.

DECLARE

TYPE REG_SP50 IS RECORD (

EJERCICIO SGP.SP50.EJERCICIO%TYPE,

NRO_EXPEDIENTE SGP.SP50.NRO_EXPEDIENTE%TYPE,

LETRA_EXPEDIENTE SGP.SP50.LETRA_EXPEDIENTE%TYPE);

Una vez definido el registro se pueden declarar registros de ese tipo.

EJ.

DECLARE

REGISTRO1 REG_SP50;

Se pueden usar como parámetros de funciones y procedimientos.

EJ.

PROCEDURE EMPLEADOS(PARAM1 REG_SP50);

Se pueden anidar registros, es decir, un registro puede ser componente de otro registro.

EJ.

DECLARE

TYPE REG_SP50 IS RECORD (EJERCICIO SGP.SP50.EJERCICIO%TYPE,

NRO_EXPEDIENTE SGP.SP50.NRO_EXPEDIENTE%TYPE,

LETRA_EXPEDIENTE SGP.SP50.LETRA_EXPEDIENTE%TYPE);

TYPE REG_CUTE IS RECORD (NUMERO NUMBER(5),

FECHA DATE,

CUTE REG_SP50);--REGISTRO ANIDADO

Atributo %ROWTYPE.

DECLARE

REG1 SGP.SP50%ROWTYPE;

CURSORES (IMPLICITOS/EXPLICITOS)(PARAMETROS EN CURSORES/FOR UPDATE)

PL/SQL usa dos tipos de cursores: implícitos y explícitos. PL/SQL declara

Cursores implícitos para todas las sentencias de manipulación de datos incluyendo queries que retornen una sola fila. Para queries que retornen más de una fila se deben declarar cursores explícitos o usar un cursor FOR LOOP.

Para el control de cursores se usan los siguientes comandos: OPEN,FETCH,CLOSE.

Cursores implícitos.

SQL%FOUND

SQL%ISOPEN

SQL%NOTFOUND

SQL%ROWCOUNT

EJ.

UPDATE SGP.SP78 SET EJEC_COMPROMISO = NVL(EJEC_COMPROMISO,0) - WAFECTA,

WHERE EJERCICIO = :OLD.EJERCICIO AND FUENTE_FINANC = :OLD.FUENTE_FINANC

AND ORG_TEC = :OLD.ORG_TEC AND SUB_CTA = :OLD.SUB_CTA

AND TRUNC(MES_ANIO,'MONTH') = TRUNC(:OLD.FECHA_RECEPCION,'MONTH');

IF SQL%NOTFOUND THEN

RAISE_APPLICATION_ERROR(-20101,'SALDOS RAE ANTERIORES INEXISTENTES');

END IF;

Declaración y explotación de cursores explícitos.

DECLARE

WLOW NUMBER(2);

WHIGH NUMBER(2);

REG SGP.SP50%ROWTYPE;

CURSOR C1 (LOW INTEGER DEFAULT 0, --LOW HIGH SON PARAMETROS FORMALES

HIGH INTEGER DEFAULT 99)

RETURN REG IS

SELECT * FROM SGP.SP50

WHERE LOW < 100 AND

HIGH < 1000;

BEGIN

OPEN C1(WLOW,WHIGH); --WLOW/WHIGH SON LOS PARAM.ACTUALES QUE TOMAN EL

LOOP --VALOR DE LAS VARIABLES DEL MISMO NOMBRE.

FETCH C1 INTO REG;

EXIT WHEN C1%NOTFOUND;

..

...

END LOOP;

CLOSE C1;

END;

Uso de cursores en subqueries.

DECLARE

CURSOR C1 IS

SELECT T1.DEPTNO, DNAME, "STAFF"

FROM DEPT T1,

(SELECT DEPTNO, COUNT(*) "STAFF" FROM EMP GROUP BY DEPTNO) T2

WHERE T1.DEPTNO=T2.DEPTNO AND

"STAFF" >= 5;

Parámetros en cursores.

Para pasar parámetros a un cursor se utiliza la sentencia OPEN. A menos que acepte los valores por default, cada parámetro formal en la declaración del cursor debe tener su parámetro actual correspondiente en la sentencia OPEN.

Cursores FOR LOOP.

Un cursor FOR LOOP declara implícitamente un índice de loop como un registro %ROWTYPE, abre el cursor, fechea repetidamente las filas del registro y cierra el cursor cuando todas las filas han sido procesadas.

Cuando un cursor FOR LOOP es ingresado, su nombre no puede pertenecer a otro que haya sido abierto con la sentencia OPEN o que esté incluído en otro cursor FOR LOOP. Antes de cada iteración FOR LOOP, PL/SQL fechea el cursor en el registro declarado implícitamente(C1_REC) el cual es equivalente a la declaración explícita siguiente:C1_REC C1%ROWTYPE. El registro es definido solamente dentro del loop. No se pueden referenciar campos de éste fuera del loop. La secuencia de sentencias en el loop es ejecutada un vez por cada fila que satisface al query asociado al cursor. Cuando se abandona el loop el cursor se cierra automáticamente o hasta que encuentre una sentencia EXIT

O GOTO o abandone el loop prematuramente por una excepción provocada dentro del loop.

EJ.

DECLARE

CURSOR C1 IS

SELECT N1,N2,N3 FROM DATA_TABLE

WHERE EXPER_NUM =1;

BEGIN

FOR C1_REC IN C1

LOOP

RESULT:=C1_REC.N2 / (C1_REC.N1 + C1_REC.N3);

END LOOP;

END;

EXCEPCIONES

Existen dos tipos de excepciones: Predefinidas y

Definidas por el Usuario

Excepciones predefinidas. Forman un paquete standard, se levantan solas.

Ej.

COLLECTION_IS_NULL(Cuando se le asigna valores a VARRAYS sin inicializar).

CURSOR_ALREADY_OPEN(Al abrir un cursor ya abierto).

LOGIN_DENIED(Usuario incorrecto).

TOO_MANY_ROWS(La select arroja más de una fila).

Excepciones Definidas por el Usuario. Las levanta el usuario con la sentencia RAISE.

EJ.

BEGIN

DECLARE

DIA_INVALIDO EXCEPTION;

MES_INVALIDO EXCEPTION;

AÑO_INVALIDO EXCEPTION;

CARACTER_INVALIDO EXCEPTION;

CARACTER_NOVALIDO EXCEPTION;

PRAGMA EXCEPTION_INIT(DIA_INVALIDO,-01847);

PRAGMA EXCEPTION_INIT(MES_INVALIDO,-01843);

PRAGMA EXCEPTION_INIT(AÑO_INVALIDO,-01841);

PRAGMA EXCEPTION_INIT(CARACTER_INVALIDO,-01858);

PRAGMA EXCEPTION_INIT(CARACTER_NOVALIDO,-01830);

BEGIN

REG_SP50.FECHA_DOC:= TO_DATE(REG_SP51.FECHA_DOC,'DD/MM/RR');

EXCEPTION WHEN DIA_INVALIDO THEN

WMENSAJE:=' DIA NO VALIDO EN FECHA DOCUMENTO';

IF LENGTH(NVL(WMENSAJE_ERROR,' ')) + LENGTH(NVL(WMENSAJE,' ')) < 1000 THEN

WMENSAJE_ERROR:=WMENSAJE_ERROR||CHR(13)||WMENSAJE;

END IF;

WHEN MES_INVALIDO THEN

WMENSAJE:=' MES NO VALIDO EN FECHA DOCUMENTO';

IF LENGTH(NVL(WMENSAJE_ERROR,' ')) +LENGTH(NVL(WMENSAJE,' ')) < 1000 THEN

WMENSAJE_ERROR:=WMENSAJE_ERROR||CHR(13)||WMENSAJE;

END IF;

WHEN AÑO_INVALIDO THEN

WMENSAJE:= ' AÑO NO VALIDO EN FECHA DOCUMENTO';

IF LENGTH(NVL(WMENSAJE_ERROR,' ')) + LENGTH(NVL(WMENSAJE,' ')) < 1000 THEN

WMENSAJE_ERROR:=WMENSAJE_ERROR||CHR(13)||WMENSAJE;

END IF;

WHEN CARACTER_INVALIDO THEN

WMENSAJE:=' CARACTER NO VALIDO EN FECHA DOCUMENTO';

IF LENGTH(NVL(WMENSAJE_ERROR,' '))+LENGTH(NVL(WMENSAJE,' ')) < 1000 THEN

WMENSAJE_ERROR:=WMENSAJE_ERROR||CHR(13)||WMENSAJE;

END IF;

WHEN CARACTER_NOVALIDO THEN

WMENSAJE:=' CARACTER NO VALIDO EN FECHA DOCUMENTO';

IF LENGTH(NVL(WMENSAJE_ERROR,' ')) + LENGTH(NVL(WMENSAJE,' ')) < 1000 THEN

WMENSAJE_ERROR:=WMENSAJE_ERROR||CHR(13)||WMENSAJE;

END IF;

END;

END;

SENTENCIAS LOOP

Existen tres tipos: LOOP. END LOOP

WHILE.LOOP

FOR.LOOP

Para salir del loop se utiliza la sentencia EXIT/EXIT WHEN, esta última se ejecuta cuano se cumple la condición WHEN.

EJ.

OPEN C1;

LOOP

FETCH C1 INTO REG;

EXIT WHEN C1%NOTFOUND;

END LOOP;

CLOSE C1;

El loop puede tener etiquetas

EJ.

<<ETIQUETA>>

LOOP

SENTENCIAS..

END LOOP;

Excepcionalmente las etiquetas se ponen en el END LOOP.

EJ.

<<ETIQUETA>>

LOOP

SENTENCIAS..

END LOOP ETIQUETA;

Loops anidados:

<<OUTER>>

LOOP

..

LOOP

..

EXIT OUTER WHEN .. --SALE DE AMBOS LOOPS

END LOOP;

...

END LOOP OUTER;

SQL DINAMICO

TABLA COLS.TABLE_NAME%TYPE;

COLUMNA COLS.COLUMN_NAME%TYPE;

--CURSOR QUE BUSCA EL NOMBRE DE LA TABLA Y LA COLUMNA

CURSOR C1 IS SELECT TABLE_NAME, COLUMN_NAME FROM COLS

WHERE UPPER(COLUMN_NAME) LIKE 'LIQUIDADO%';

--VARIABLES PARA SQL DINAMICO

V7 INTEGER:=2;

W_CUR INTEGER;

W_RES INTEGER;

WUPDATE VARCHAR2(500);

WVAR VARCHAR2(20);

WX VARCHAR2(50);

BEGIN

OPEN C1;

W_CUR:=DBMS_SQL.OPEN_CURSOR;

LOOP

FETCH C1 INTO TABLA, COLUMNA;

IF C1%NOTFOUND THEN

EXIT; --SALE CUANDO NO SE ENCUENTRAN MAS TABLAS

END IF;

BEGIN

WVAR:='HG'||SUBSTR(RTRIM(TABLA),3,4)||'%';

SELECT TRIGGER_NAME INTO WX FROM USER_TRIGGERS WHERE TRIGGER_NAME LIKE WVAR;

DBMS_SQL.PARSE(W_CUR,'ALTER TRIGGER '||WX||' DISABLE',V7);

W_RES:=DBMS_SQL.EXECUTE(W_CUR);

EXCEPTION WHEN NO_DATA_FOUND THEN

WX:=NULL;

END;

WUPDATE:='UPDATE '||RTRIM(TABLA)||

' SET '

||RTRIM(COLUMNA)||

' = ''S'' WHERE '

||RTRIM(COLUMNA)||

' <> ''S'' ';

DBMS_OUTPUT.PUT_LINE(WUPDATE);

DBMS_SQL.PARSE(W_CUR,WUPDATE,V7);

W_RES:=DBMS_SQL.EXECUTE(W_CUR);

IF WX IS NOT NULL THEN

DBMS_SQL.PARSE(W_CUR,'ALTER TRIGGER '||WX||' ENABLE',V7);

W_RES:=DBMS_SQL.EXECUTE(W_CUR);

END IF;

END LOOP;

DBMS_SQL.CLOSE_CURSOR(W_CUR);

CLOSE C1;

Naming Conventions

PL/SQL User's Guide and Reference

Synonyms

You can create synonyms to provide location transparency for remote schema

objects such as tables, sequences, views, stand-alone subprograms, and packages.

However, you cannot create synonyms for items declared within subprograms or

packages. That includes constants, variables, cursors, cursor variables, exceptions,

and packaged subprograms.

Scoping

Within the same scope, all declared identifiers must be unique. So, even if their

datatypes differ, variables and parameters cannot share the same name. For

example, two of the following declarations are illegal:

DECLARE

valid_id BOOLEAN;

valid_id VARCHAR2(5); -- illegal duplicate identifier

FUNCTION bonus (valid_id IN INTEGER) RETURN REAL IS ...

-- illegal triplicate identifier

For the scoping rules that apply to identifiers, see "Scope and Visibility" on

page 2-37.

Case Sensitivity

Like all identifiers, the names of constants, variables, and parameters are not case

sensitive. For instance, PL/SQL considers the following names to be the same:

DECLARE

zip_code INTEGER;

Zip_Code INTEGER; -- same as zip_code

Name Resolution

In potentially ambiguous SQL statements, the names of database columns take

precedence over the names of local variables and formal parameters. For example,

the following DELETE statement removes all employees from the emp table, not just

'KING', because Oracle assumes that both enames in the WHERE clause refer to the

database column:

DECLARE

ename VARCHAR2(10) := 'KING';

BEGIN

DELETE FROM emp WHERE ename = ename;

Scope and Visibility

Fundamentals 2-37

In such cases, to avoid ambiguity, prefix the names of local variables and formal

parameters with my_, as follows:

DECLARE

my_ename VARCHAR2(10);

Or, use a block label to qualify references, as in

<<main>>

DECLARE

ename VARCHAR2(10) := 'KING';

BEGIN

DELETE FROM emp WHERE ename = main.ename;

The next example shows that you can use a subprogram name to qualify references

to local variables and formal parameters:

FUNCTION bonus (deptno IN NUMBER, ...) RETURN REAL IS

job CHAR(10);

BEGIN

SELECT ... WHERE deptno = bonus.deptno AND job = bonus.job;

For a full discussion of name resolution, see Appendix D.

Scope and Visibility

References to an identifier are resolved according to its scope and visibility. The

scope of an identifier is that region of a program unit (block, subprogram, or

package) from which you can reference the identifier. An identifier is visible only in

the regions from which you can reference the identifier using an unqualified name.

Figure 2-2 shows the scope and visibility of a variable named x, which is declared

in an enclosing block, then redeclared in a sub-block.

Identifiers declared in a PL/SQL block are considered local to that block and global

to all its sub-blocks. If a global identifier is redeclared in a sub-block, both

identifiers remain in scope. Within the sub-block, however, only the local identifier

is visible because you must use a qualified name to reference the global identifier.

Although you cannot declare an identifier twice in the same block, you can declare

the same identifier in two different blocks. The two items represented by the

identifier are distinct, and any change in one does not affect the other. However, a

block cannot reference identifiers declared in other blocks at the same level because

those identifiers are neither local nor global to the block.

Scope and Visibility

PL/SQL User's Guide and Reference

Scope and Visibility

PL/SQL User's Guide and Reference

Figure 2-2 Scope and Visibility

The example below illustrates the scope rules. Notice that the identifiers declared in

one sub-block cannot be referenced in the other sub-block. That is because a block

cannot reference identifiers declared in other blocks nested at the same level.

DECLARE

a CHAR;

b REAL;

BEGIN

-- identifiers available here: a (CHAR), b

DECLARE

a INTEGER;

c REAL;

BEGIN

-- identifiers available here: a (INTEGER), b, c

END;

Scope Visibility

Outer x

Inner x

DECLARE

X REAL;

BEGIN

DECLARE

X REAL;

BEGIN

END;

DECLARE

XREAL;

BEGIN

DECLARE

XREAL;

BEGIN

END;

END; END;

DECLARE

X REAL;

BEGIN

DECLARE

X REAL;

BEGIN

END;

END;

DECLARE

X REAL;

BEGIN

DECLARE

X REAL;

BEGIN

END;

END;

Scope and Visibility

Fundamentals 2-39

DECLARE

d REAL;

BEGIN

-- identifiers available here: a (CHAR), b, d

END;

-- identifiers available here: a (CHAR), b

END;

Recall that global identifiers can be redeclared in a sub-block, in which case the local

declaration prevails and the sub-block cannot reference the global identifier unless

you use a qualified name. The qualifier can be the label of an enclosing block, as the

following example shows:

<<outer>>

DECLARE

birthdate DATE;

BEGIN

DECLARE

birthdate DATE;

BEGIN

IF birthdate = outer.birthdate THEN ...

As the next example shows, the qualifier can also be the name of an enclosing

subprogram:

PROCEDURE check_credit (...) IS

rating NUMBER;

FUNCTION valid (...) RETURN BOOLEAN IS

rating NUMBER;

BEGIN

IF check_credit.rating < 3 THEN ...

However, within the same scope, a label and a subprogram cannot have the same

name.

Assignments

PL/SQL User's Guide and Reference

Assignments

Variables and constants are initialized every time a block or subprogram is entered.

By default, variables are initialized to NULL. So, unless you expressly initialize a

variable, its value is undefined, as the following example shows:

DECLARE

count INTEGER;

BEGIN

count := count + 1; -- assigns a null to count

The expression on the right of the assignment operator yields NULL because count

is null. To avoid unexpected results, never reference a variable before you assign it a

value.

You can use assignment statements to assign values to a variable. For example, the

following statement assigns a new value to the variable bonus, overwriting its old

value:

bonus := salary * 0.15;

The expression following the assignment operator can be arbitrarily complex, but it

must yield a datatype that is the same as or convertible to the datatype of the

variable.

Boolean Values

Only the values TRUE, FALSE, and NULL can be assigned to a Boolean variable. For

example, given the declaration

DECLARE

done BOOLEAN;

the following statements are legal:

BEGIN

done := FALSE;

WHILE NOT done LOOP

END LOOP;

When applied to an expression, the relational operators return a Boolean value. So,

the following assignment is legal:

done := (count > 500);

Expressions and Comparisons

Fundamentals 2-43

Logical Operators

The logical operators AND, OR, and NOT follow the tri-state logic shown in Table 2-

AND and OR are binary operators; NOT is a unary operator.

As the truth table shows, AND returns TRUE only if both its operands are true. On

the other hand, OR returns TRUE if either of its operands is true. NOT returns the

opposite value (logical negation) of its operand. For example, NOT TRUE returns

FALSE.

NOT NULL returns NULL because nulls are indeterminate. It follows that if you apply

the NOT operator to a null, the result is also indeterminate. Be careful. Nulls can

cause unexpected results; see "Handling Nulls" on page 2-48.

Order of Evaluation

When you do not use parentheses to specify the order of evaluation, operator

precedence determines the order. Compare the following expressions:

NOT (valid AND done) | NOT valid AND done

If the Boolean variables valid and done have the value FALSE, the first expression

yields TRUE. However, the second expression yields FALSE because NOT has a

higher precedence than AND. Therefore, the second expression is equivalent to:

(NOT valid) AND done

Datatypes

Fundamentals 2-15

LONG and LONG RAW

You use the LONG datatype to store variable-length character strings. The LONG

datatype is like the VARCHAR2 datatype, except that the maximum length of a LONG

value is 32760 bytes.

You use the LONG RAW datatype to store binary data or byte strings. LONG RAW data

is like LONG data, except that LONG RAW data is not interpreted by PL/SQL. The

maximum length of a LONG RAW value is 32760 bytes.

You can insert any LONG value into a LONG database column because the maximum

width of a LONG column is 2147483647 bytes. However, you cannot retrieve a value

longer than 32760 bytes from a LONG column into a LONG variable.

Likewise, you can insert any LONG RAW value into a LONG RAW database column

because the maximum width of a LONG RAW column is 2147483647 bytes. However,

you cannot retrieve a value longer than 32760 bytes from a LONG RAW column into a

LONG RAW variable.

LONG columns can store text, arrays of characters, or even short documents. You can

reference LONG columns in UPDATE, INSERT, and (most) SELECT statements, but

not in expressions, SQL function calls, or certain SQL clauses such as WHERE, GROUP

BY, and CONNECT BY. For more information, see Oracle8i SQL Reference.

RAW

You use the RAW datatype to store binary data or byte strings. For example, a RAW

variable might store a sequence of graphics characters or a digitized picture. Raw

data is like VARCHAR2 data, except that PL/SQL does not interpret raw data.

Likewise, Net8 does no character set conversions when you transmit raw data from

one system to another.

The RAW datatype takes a required parameter that lets you specify a maximum

length up to 32767 bytes. The syntax follows:

RAW(maximum_length)

You cannot use a constant or variable to specify the maximum length; you must use

an integer literal in the range 1 .. 32767.

The maximum width of a RAW database column is 2000 bytes. So, you cannot insert

RAW values longer than 2000 bytes into a RAW column. You can insert any RAW value

into a LONG RAW database column because the maximum width of a LONG RAW

column is 2147483647 bytes. However, you cannot retrieve a value longer than

32767 bytes from a LONG RAW column into a RAW variable.

Datatypes

PL/SQL User's Guide and Reference

ROWID and UROWID

Internally, every database table has a ROWID pseudocolumn, which stores binary

values called rowids. Each rowid represents the storage address of a row. A physical

rowid identifies a row in an ordinary table. A logical rowid identifies a row in an

index-organized table. The ROWID datatype can store only physical rowids.

However, the UROWID (universal rowid) datatype can store physical, logical, or

foreign (non-Oracle) rowids.

Suggestion: Use the ROWID datatype only for backward compatibility with old

applications. For new applications, use the UROWID datatype.

When you select or fetch a rowid into a UROWID variable, you can use the built-in

function ROWIDTOCHAR, which converts the binary value into an 18-byte character

string. Conversely, the function CHARTOROWID converts a UROWID character string

into a rowid. If the conversion fails because the character string does not represent a

valid rowid, PL/SQL raises the predefined exception SYS_INVALID_ROWID. This

also applies to implicit conversions.

Physical Rowids Physical rowids provide fast access to particular rows. As long as

the row exists, its physical rowid does not change. Efficient and stable, physical

rowids are useful for selecting a set of rows, operating on the whole set, and then

updating a subset. For example, you can compare a UROWID variable with the

ROWID pseudocolumn in the WHERE clause of an UPDATE or DELETE statement to

identify the latest row fetched from a cursor. See "Fetching Across Commits" on

page 5-49.

A physical rowid can have either of two formats. The 10-byte extended rowid format

supports tablespace-relative block addresses and can identify rows in partitioned

and non-partitioned tables. The 6-byte restricted rowid format is provided for

backward compatibility.

Extended rowids use a base-64 encoding of the physical address for each row

selected. For example, in SQL*Plus (which implicitly converts rowids into character

strings), the query

SQL> SELECT rowid, ename FROM emp WHERE empno = 7788;

might return the following row:

ROWID ENAME

AAAAqcAABAAADFNAAH SCOTT


Document Info


Accesari: 7971
Apreciat: hand-up

Comenteaza documentul:

Nu esti inregistrat
Trebuie sa fii utilizator inregistrat pentru a putea comenta


Creaza cont nou

A fost util?

Daca documentul a fost util si crezi ca merita
sa adaugi un link catre el la tine in site


in pagina web a site-ului tau.




eCoduri.com - coduri postale, contabile, CAEN sau bancare

Politica de confidentialitate | Termenii si conditii de utilizare




Copyright © Contact (SCRIGROUP Int. 2024 )