Saturday, October 27, 2007

Continuación %ROWTYPE

A few days ago, I posted an entry, Anchored Declarations - %TYPE and %ROWTYPE. That article talked about using anchored declarations in your PL/SQL code.

PeteF ask a couple of questions about that post:

Inglés:

Nice little article - I have a couple of questions... Is there any way to utilise the %rowtype attribute from within a trigger i.e. can I easily populate a rowtype variable with all the old (or new) columns in one shot? Number two - is there an easy way to write the rowtype variable back to the DB without having to mention every column name? As you say in your article - all sacrilege I'm sure but hey ;) tia Pete


Español
Niza poco el artículo - Tengo un par de preguntas ... ¿Hay alguna forma de utilizar el atributo de rowtype% dentro de un disparador es decir que fácilmente puede rellenar el rowtype variable con todas las viejas (o nuevas) las columnas de una sola? Número dos, hay una forma sencilla de escribir la variable de rowtype al PP, sin tener que mencionar el nombre de columna? Como usted dice en su artículo, todos los sacrilegio estoy seguro, pero bueno;) Pete tia


Pete - No puedo ayudarle en la pregunta # 1. Por lo que sé, usted tiene que hacer referencia a cada una de las columnas por separado cuando se utiliza :new y :old. Hay que ser agradable ser capaz de ceder todo en una marejada foop pero por desgracia, :new y :old son seudo columnas, en contraposición a los registros.

Sobre la pregunta, el número 2, la respuesta es afirmativa. Puedes seleccionar una rowtype variables, hacer algunos cambios y, a continuación, inserte de nuevo.

declare
v_emp_rec employees%rowtype;
begin
select *
into v_emp_rec
from employees
where rownum = 1;

v_emp_rec.last_name := 'Lewis';
v_emp_rec.first_name := 'Cunningham';
v_emp_rec.email := 'lewis@email.com';
v_emp_rec.employee_id := 9999;

insert into employees values v_emp_rec;

end;
/


En ésta, que ha cambiado los campos requeridos (PK y el mensaje que es una clave única) y el nombre y, a continuación, inserta la fila como una fila nueva.

Schwierman también publicó un comentario:

Inglés:
Number two...

Have you tried the bulk collect update statement. I am using a table array, but, maybe a rowtype would work.

FORALL x IN 1 .. ptbl_lp_io.COUNT SAVE EXCEPTIONS
UPDATE lp
SET ROW = ptbl_lp_io (x)
WHERE lp_id = ltbl_lp_id (x);


Español
Número dos ...

Has intentado recoger la mayor parte de actualización. Estoy utilizando una tabla matriz, pero tal vez un rowtype de trabajo.

FORALL x IN 1 .. ptbl_lp_io.COUNT SAVE EXCEPTIONS
UPDATE lp
SET ROW = ptbl_lp_io (x)
WHERE lp_id = ltbl_lp_id (x);


Creo que se pete responder a la segunda pregunta del uso de bulk collect. Un completo ejemplo de ello es:

SQL> CREATE TABLE employees_new AS SELECT * FROM employees WHERE ROWNUM < 1;

Table created.

SQL> SELECT COUNT(*) FROM EMPLOYEES;

COUNT(*)
----------
107

SQL> SELECT COUNT(*) FROM employees_new;

COUNT(*)
----------
0

SQL> DECLARE
2
3 type arr_emp_recs IS TABLE OF employees % rowtype;
4 v_emp_rec arr_emp_recs;
5 BEGIN
6
7 SELECT *
8 bulk collect
9 INTO v_emp_rec
10 FROM employees;
11
12 FORALL x IN 1..v_emp_rec.COUNT
13 INSERT INTO employees_new VALUES v_emp_rec(x);
14
15 COMMIT;
16
17 END;
18 /

PL/SQL procedure successfully completed.

SQL> SELECT COUNT(*) FROM employees_new;

COUNT(*)
----------
107

SQL>

Declaraciones anclado - %TYPE y %ROWTYPE

Cuando se declara una variable, hay que darle un tipo de datos y de un tamaño.

Vamos a suponer por un momento que tengo una tabla que se parece a esto:

SQL> desc employees
Name Null? Type
----------------------------------------- -------- ----------------------------
EMPLOYEE_ID NOT NULL NUMBER(6)
FIRST_NAME VARCHAR2(20)
LAST_NAME NOT NULL VARCHAR2(25)
EMAIL NOT NULL VARCHAR2(25)
PHONE_NUMBER VARCHAR2(20)
HIRE_DATE NOT NULL DATE
JOB_ID NOT NULL VARCHAR2(10)
SALARY NUMBER(8,2)
COMMISSION_PCT NUMBER(2,2)
MANAGER_ID NUMBER(6)
DEPARTMENT_ID NUMBER(4)
SQL>


Podría crear un pl/sql- código de la unidad que acceder a algunas de estas columnas. Por ejemplo:

DECLARE
v_employee_id NUMBER(6);
v_hire_date DATE;
v_last_name VARCHAR2(25);
BEGIN
SELECT employee_id, last_name, hire_date
INTO v_employee_id, v_last_name, v_hire_date
FROM employees
WHERE rownum = 1;
END;


En este fragmento de código, declaró el número 6 dígitos de longitud, una fecha y un varchar2 de 25 caracteres de largo. Aunque estos tamaños coinciden con mi cuadro, hay una forma mejor de hacer esto:

DECLARE
v_employee_id employees.employee_id%TYPE;
v_hire_date employees.hire_date%TYPE;
v_last_name employees.last_name%TYPE;
BEGIN
SELECT employee_id, last_name, hire_date
INTO v_employee_id, v_last_name, v_hire_date
FROM employees
WHERE rownum = 1;
END;


Mismos resultados, pero ahora mi software es sólo un poco más fácil de mantener. Si yo uso constantemente %TYPE todo mi código, puede cambiar el tamaño de columna con un poco menos preocupación. Técnicamente, puede ser capaz de cambiar los tipos de datos y estar bien, pero he encontrado que, en la práctica, cuando el usuario cambia los tipos de datos, se necesitará revisar una gran cantidad de su código.

%TYPE es usado cuando usted se refiere son las columnas individuales. Hay muchos casos en donde será usado toda una fila. En lugar de crear manualmente un tipo de registro, puede declarar una variable de %ROWTYPE. Por ejemplo, a continuación voy a seleccionar todas las columnas de mi tabla:

DECLARE
v_employees employees%ROWTYPE;
BEGIN
SELECT *
INTO v_employees
FROM employees
WHERE rownum = 1;
END;


Esta recoge la totalidad de las columnas y los ponga a disposición en su programa. Puede detallar cada una de las columnas en su lista de selección como este:

DECLARE
v_employees employees%ROWTYPE;
BEGIN
SELECT employee_id, first_name, last_name,
email, phone_number, hire_date, job_id, salary,
commission_pct, manager_id, department_id
INTO v_employees
FROM employees
WHERE rownum = 1;
END;


Si lo hace detallar cada una de las columnas, es necesario mantenerlos en las columnas en el mismo orden que se declaran en su mesa. Si añade una columna de la tabla, tendrá que modificar su código.

"SELECT *" es más fácil de leer. Asimismo, en los casos en que es necesario recoger las nuevas columnas (por lo general, los procedimientos de mantenimiento tipo), "SELECT *" recoge nuevas columnas con un solo recompilar, en contraposición a la necesidad de añadir manualmente las columnas.

Este es un caso en el que usted necesita para hacer una llamada en cuanto a si un "SELECT *" es una mala cosa o no. Yo no tengo un problema con el "SELECT *" en estos casos. En realidad, me atrevería a decir incluso recomendar que en el caso de que usted realmente necesita todas las columnas (o incluso la mayoría de las columnas). Me doy cuenta de que es una herejía para muchos. Oh, bien.

Una última nota es que %TYPE y %ROWTYPE también como parámetros de trabajo y es una gran manera de enviar datos en torno a que es arrastrada desde su base de datos. Por ejemplo:

CREATE OR REPLACE 
PROCEDURE get_employee( p_employee_rec OUT employees%ROWTYPE )
AS
BEGIN
SELECT *
INTO p_employee_rec
FROM employees
WHERE rownum = 1;
END;


Este fragmento de código devolverá un registro de los datos del empleado a la llamada de rutina.

%TYPE y %ROWTYPE se llaman anclado declaraciones. Básicamente, usted es el tipo de datos de su anclaje declaraciones a la columna de definiciones en su base de datos. Además de asegurar que sus datos tipos y tamaños siempre coinciden, se hace más fácil ya que el código no tiene que buscar los tamaños, así como cada vez que escribir un pedazo de código.

Utilice anclado declaraciones. Utilizar de manera consecuente y la gente que sigue a lo largo de atrás para mantener su código gracias.

Saturday, October 13, 2007

Por favor, ayúdame a cabo y responder a una pregunta

Como es posible que puedas decir, no soy un experto español. Quería crear un blog para que más personas puede ayudar a empezar con Oracle por lo que optaron por crear un blog que se escribe en español. Yo uso el traductor Google herramienta para crear este blog de escritos que he hecho en inglés.

Entonces, mi pregunta es, ¿encontraste esta página útil? Aun con la mala gramática? ¿Le gustaría a mí seguir con la publicación?

Gracias de antemano por su respuesta. Soy consciente de que tomar el tiempo para hacerlo.

LewisC

¿Qué es una base de datos de enlace?

Una base de datos de enlace es la forma de Oracle le permite conectarse desde una base de datos a otro. Un enlace a la base de datos de una base de datos remota utilizando una ID y una contraseña al igual que un usuario, pero sólo permite el acceso programático.

Base de datos permitirá a los vínculos de procesamiento distribuido. Replicación es un excelente ejemplo de una aplicación que utiliza la base de datos enlaces. Replicación de bases de datos Oracle utiliza vínculos con el movimiento de datos de una base de datos a otro.

Un vínculo es una base de datos en un solo sentido conducto que le permita realizar LMD contra bases de datos remotas al igual que lo haría en contra de una base de datos local. Su SQL no es necesario cambiar los requisitos, salvo que la base de datos que desea acceder.

En segundo lugar, la vinculación requiere de bases de datos remotas de base de datos que se definan a su servidor. El cliente pueda que no saben nada acerca de una base de datos y que todavía existe la posibilidad de crear un enlace. Lo inverso también es válido; Si el cliente es consciente de una base de datos, pero el servidor no es, no puede crear un vínculo.

Ejemplos de la creación y uso de PP Enlaces

Seleccione sysdate doble de la tabla en una base de datos remota RemoteDB nombres de los usuarios conectados mediante un enlace:

CREATE DATABASE LINK MyRemoteDB USING 'RemoteDB';

SELECT sysdate FROM DUAL@MyRemoteDB;


Ejecutar un procedimiento almacenado en la base de datos remota:

BEGIN
runProc@MyRemoteDB;
END;


Ejecuta una función envasados en la base de datos remota:

DECLARE
var1 VARCHAR2(10);
BEGIN
Var1 := runFunc@MyRemoteDB;
END;


Crear una cuenta utilizando el seleccionado anteriormente:

CREATE OR REPLACE VIEW Remote_Sysdate_VW AS
SELECT sysdate AS remoteSysdate
FROM DUAL@MyRemoteDB;

SELECT * FROM remote_sysdate_vw;

¿Cuáles son los NCHAR y NVARCHAR2 tipos de datos?

Usted podrá declarar NVARCHAR2 lugar de VARCHAR2. NVARCHAR2 se utiliza para almacenar los conjuntos de caracteres Unicode. Yo, personalmente, nunca han tenido un uso para NVARCHAR2. Si escribir aplicaciones multilingües y utilizar un juego de caracteres Unicode, en lugar de utilizar NVARCHAR2 VARCHAR2. CHAR también tiene un correspondiente NCHAR.

Largo restricciones son las mismas que un VARCHAR2 y UTF8 puede almacenar 32767 dividido por 2 y UTF16 puede almacenar 32767 dividido por 3. No se puede mezclar y combinar VARCHAR2 NVARCHAR2 y las variables. Usted debe escoger uno o el otro y se pegan con él. Ambos están disponibles en SQL y PL / SQL.

What is the CHAR Datatype?

CHAR es una longitud fija de datos. Si no se especifica un tamaño máximo, el valor por defecto es 1. El tamaño máximo para un carácter en una columna es de 2000 bytes y 32767 en PL / SQL.

Yo bastante considerar CHAR a ser un legado de datos. Algunas personas utilizan CHAR (1) para almacenar indicadores (Y, N, etc) o como una tabla BOOLEAN. Prefiero usar VARCHAR2 incluso en esos casos.

Un caso que puede estar justificada (en mi opinión, de todos modos, esta es mi opinión) sería rellenar los datos desde o hacia un modelo de informe que tendrá que ser reproducida. Por ejemplo, si lee un archivo de longitud fija, y puede que necesite para generar el archivo de longitud fija que en el futuro, que se va a guardar su conversión de algunos generales por el almacenamiento de los datos en una longitud fija de datos (es decir CHAR).

Una de las áreas que la gente meterse en problemas son CHAR y VARCHAR2 comparaciones. Si se quede con VARCHAR2, usted no tendrá problemas.

¿Cuál es la FECHA Dato?

DATE El dato es un dato fecha. Almacena una fecha y una hora. La fecha parte se basa en el número de días desde el 1 de enero de 4712 aC. El tiempo se basa en el número de segundos desde mediados de la noche.

Un campo de fecha se declara como una variable seguida por el nombre DATE palabra clave:

v_date_field DATE;

No hay "correcto" el formato de una fecha. El formato está determinada por varios factores. En la base de datos, se puede establecer que la NLS_DATE_FORMAT. Independientemente de cómo se establece el valor por defecto en su base de datos, siempre debe asegurarse de que explícitamente el uso de un formato de fecha al convertir la máscara.

Voy a cubrir funciones de la conversión de todos los tipos de datos en un futuro artículo, pero creo que esto es importante. Si necesita comparar una fecha para un literal, asegúrese de usar un formato de fecha máscara. Usted podría decir:

WHERE date_field = '01-01-1999'

O usted podría decir:

WHERE date_field = to_date('01-01-1999', 'DD-MM-YYYY')

Y eso nos lleva a la razón por la que utilizar un DATE lugar de un personaje o de un campo numérico. Yo estoy a menudo preguntó acerca de las mejores prácticas, con fechas y horas. Por alguna razón, nunca he entendido, algunas personas consideran que el almacenamiento de las fechas y horas como el número de caracteres y es mejor que la de Oracle que permite que los datos que manejan en un formato nativo. Llámame vago, pero si Oracle puede hacerlo por mí, voy a dejarlo.

A modo de ejemplo, digamos que usted desea añadir 1 día a la fecha. Si esa fecha se almacena en un personaje sobre el terreno, usted tendría que hacer algún tipo de transformación y manipulación de lograr eso. Si usamos una fecha sobre el terreno, es tan fácil como date_field + 1. ¿Cómo lograr la adición de una hora? El uso de un tipo de la fecha, no puedo añadir date_field + 1 / 24. Es decir, añadir un 1 a 1 día y obtener añadir 1/24th de un día llegar hasta 1 hora. Para añadir 2 horas, yo añadiría date_field + 2 / 24. ¿Cómo hacerlo con un carácter sobre el terreno?

Reconozco si almacena los datos en un campo numérico, que puede ser más fácil de almacenar como un personaje. En ese caso, la adición de 1 día o 1 hora podría ser bastante fácil. Pero, ¿cómo se puede añadir 3 meses? Con un campo de fecha, se utiliza add_months (date_field, 3). ¿Cómo restar 3 meses? Con un campo de fecha, se utiliza add_months (date_field, -3). ¿Cómo obtener el último día del mes en un campo de fecha? Con un campo de fecha, se puede decir last_day (date_field). La lista va en un sobre.

Aquí está una de las normas más importantes que usted puede aprender acerca de cómo utilizar una base de datos. Si puede hacerlo por ti, y mucho. Si se trata de la fecha o la hora, por no hablar de que la gestión de la base de datos para usted. Gastar su tiempo escribiendo aplicaciones, y no bajo nivel de apoyo rutinas.

Algunas normas acerca de la fecha en que las matemáticas son cuando usted restar una fecha a partir de la fecha, se obtiene un número de días. Al restar el número de una fecha, se obtiene una fecha menos de la fecha de inicio. Cuando se añade un número a la fecha, se obtiene una fecha posterior a la fecha de inicio. No se puede añadir una fecha a fecha.

Saturday, October 6, 2007

El usar NVL2

NVL2 es una pequeña función aseada del SQL que pienso soy underused. Se parece a mí que podría tener un nombre mejor.

El formato es NVL2 (expr1, expr2, expr3). Qué lo hace es si expr1 es NULL, él vuelve expr3. Si expr1 NOT NULL, vuelve expr2.

IF la declaración para hacer igual parecería:

IF expr1 IS NULL 
THEN
expr3
ELSE
expr2
END IF


Tiendo para conseguir expr2 y expr3 al revés cada vez que utilizo esta función. No soy seguro porqué. Conjeturo que resuelvo mentalmente expresiones del non-NOT antes NO de expresiones.

Tan si funcionaste esta escritura:

SELECT nvl2('ABC', 'DEF', 'GHI')
FROM DUAL
/


SELECT nvl2(NULL, 'DEF', 'GHI')
FROM DUAL
/


Conseguirías esta salida:

NVL
---
DEF


1 row selected.


NVL
---
GHI


1 row selected.

Quitar los espacios después de TO_CHAR con el modificante del formato de FM

Hoy, voy a darte una extremidad de Oracle para conseguir librado de espacios después de que hayas utilizado TO_CHAR:

Si funciono esta escritura:

select to_char(1234.89, '$999,990.00') num_format
from dual
/

select to_char(SYSDATE, 'Day, Month DD, YYYY') date_format
from dual
/

Consigo:

NUM_FORMAT
------------
$1,234.89

1 row selected.

DATE_FORMAT
-----------------------------
Friday , August 14, 2006

1 row selected.

¿Notas el plomo el espaciar en la primera declaración y el espaciamiento impar en el segundo?

Eso puede ser molesto. Conseguir libró de él, uso justo el modificante de la máscara del formato de FM.

Ahora puedo funcionar esto:

Y consigo:

NUM_FORMAT
------------
$1,234.89

1 row selected.

DATE_FORMAT
-----------------------------
Friday, August 14, 2006

1 row selected.

Monday, October 1, 2007

¿Cuál es la diferencia entre el SQL y PL/SQL?

¿Cuál es SQL?

El SQL se compone de DML y de DDL. DML son las palabras claves que utilizas tener acceso y manipular a datos, por lo tanto la lengua de manipulación de datos conocida. DDL son las palabras claves que utilizas crear objetos tales como opiniónes, tablas y procedimientos, por lo tanto el idioma de definición de datos conocido. Los ejemplos de DML son SELECT, UPDATE, INSERT, MERGE, DELETE, etc. Los ejemplos de DDL son CREATE TABLE, ALTER VIEW, CREATE OR REPLACE PROCEDURE, el etc.

Ejemplo DDL:


CREATE TABLE whatever (
column1 NUMBER NOT NULL PRIMARY KEY,
column2 VARCHAR2(10),
column3 DATE );


Ejemplo DML:


INSERT INTO whatever (column1, column2, column3)
VALUES (1, 'Text Data', sysdate );

SELECT column1, column2, column3
FROM whatever;

COMMIT;


¿Cuáles son comandos del SQL?

Los comandos del SQL son los comandos que no son realmente una parte del estándar del SQL pero son apoyados por las herramientas que apoyan el SQL. Por ejemplo, el SQL*Plus ha estado alrededor de un de largo plazo y muchas herramientas que permiten el scripting también permiten comandos del SQL*Plus. Cuando alguien me pregunta acerca de un comando del SQL, primero clarifico si el medio una palabra clave del SQL o un comando del SQL*Plus (o un poco de otra herramienta).

Los comandos del SQL se significan generalmente de ayudar a formato para hacer salir: La BREAK, BTITLE, COLUMN, PRINT o ellos se significan para crear o para almacenar datos o las escrituras: COMPUTE, DEFINE, STORE, SAVE. Hay también los comandos que obran recíprocamente con la base de datos: SHUTDOWN, CONNECT, COPY. Y hay por lo menos uno que obra recíprocamente con datos: XQUERY.

Tan cuando oyes a alguien referir a un comando del SQL, primero preguntar si realmente significan el SQL o si significan la herramienta del SQL ellos están utilizando.

¿Cuál es PL/SQL?

La respuesta rápida es de la guía del usuario de PL/SQL:

PL/SQL, extensión procesal de Oracle del SQL, es un lenguaje de programación fourth-generation avanzado (4GL). Ofrece características de la software-ingeniería tales como encapsulación de datos, sobrecargar, tipos de la colección, excepciones, y ocultar de la información. PL/SQL también apoya prototyping y el desarrollo rápidos con la integración apretada con el SQL y la base de datos de Oracle.


¿Pero qué ese medio? La llave aquí es las palabras: extensión procesal del SQL. PL/SQL es una lengua procesal como C++, Java, ADA, etc. Si tiene variables y declaraciones de la variable, los controles condicionales como IF y CASE. Tiene estructuras de colocación tales como LOOP, FOR LOOP y WHILE LOOP. PL/SQL utiliza el SQL para utilizar, para manipular y para ahorrar datos a la base de datos.

Si deseara crear mis el propios, muy corto, definición de PL/SQL sería ésta: PL/SQL es el lenguaje de programación nativo de Oracle que proporciona el desarrollo base de datos-céntrico del uso. Puede llamar nativo el SQL estático y proporciona métodos múltiples de llamar el SQL dinámico.

Ejemplo PL/SQL:


BEGIN
-- A PL/SQL cursor
FOR c1 IN (
SELECT * FROM whatever ) -- This is SQL called by PL/SQL
LOOP

DBMS_OUTPUT.PUT_LINE( 'Column1 is: ' || TO_CHAR(c1.column1) ||
', Column2 is: ' || c1.column2 ||
', Column3 is: ' || TO_CHAR(c1.column3 ) );
END LOOP;

END;


Y ahora la respuesta a la pregunta principal: ¿cuál es la diferencia entre el SQL y PL/SQL? El SQL es una lengua orientada los datos para los sistemas que seleccionan y de manipulaciones de datos. PL/SQL es una lengua procesal para crear usos. No tienes normalmente un “uso del SQL”. Tienes normalmente un uso que utilice el SQL y una base de datos emparentada en el back-end. PL/SQL puede ser la lengua del uso apenas como Java o poder de PHP. El SQL puede ser la fuente de los datos para tus pantallas, Web pages e informes. PL/SQL pudo ser la lengua que utilizas construir, ajustar a formato y exhibir esas pantallas, Web pages e informes.

Pensar en él tienen gusto de esto: El código que hace tu función del programa es PL/SQL. El código que manipula los datos es SQL DML. El código que crea objetos almacenados de la base de datos es SQL DDL. DDL compila el código que se escribe en PL/SQL. PL/SQL puede llamar el SQL para realizar la manipulación de datos. Los comandos que ajustaron a formato la salida de una herramienta no se relacionan con el SQL estándar o con PL/SQL.

Saturday, September 29, 2007

El SQL básico ensambla

El primeros nos ensamblan cubrirán se llaman un equijoin, también llamado un interno ensamblan. Aquí es donde una columna (o las columnas múltiples) en dos o más tablas empareja. Por nuestro ejemplo:

SELECT emp.ename, dept.dname
FROM emp JOIN dept
ON emp.deptno = dept.deptno
/


Qué este selecto dice es seleccionar la columna del ename de la tabla del emp junto con la columna del dname en la tabla del departamento. Ensamblar el emp y el departamento comparando las columnas del deptno en cada uno para la igualdad.

Puedo pensar en por lo menos tres otras maneras de escribir esta pregunta en Oracle, pero creo que ésta es la manera más clara y más intuitiva de hacer tan. Puedes también ver la pregunta antedicha escrita como esto:

SELECT emp.ename, dept.dname
FROM emp INNER JOIN dept
ON emp.deptno = dept.deptno
/


Oracle omite automáticamente el JOIN a INNER para no requerir la palabra clave INNNER. Son la misma pregunta, aunque. Apenas prefiero no mecanografiar la palabra clave INNER.

Y cómo limitamos esto apenas al departamento de las SALES:

SELECT emp.ename, dept.dname
FROM emp JOIN dept
ON emp.deptno = dept.deptno
WHERE dept.dname = 'SALES'
/


Esto está consiguiendo útil ahora. La autorización, nos dejó volver a todos los empleados en las OPERATIONS del departamento.

SELECT emp.ename, dept.dname
FROM emp JOIN dept
ON emp.deptno = dept.deptno
WHERE dept.dname = 'OPERATIONS'
/


Uh, oh. No conseguimos ninguna fila vuelta. Si nos referimos de nuevo a nuestra pregunta anterior, podemos ver que hay un dname de operaciones, pero no tenemos ningún empleado en ese departamento. ¿Cómo podemos conseguir detrás un expediente con el dname? Necesitamos un OUTER JOIN. Un externo ensambla dice Oracle volver las filas a la izquierda o derecho (de la cláusula del JOIN) aunque no hay filas.

SELECT emp.ename, dept.dname
FROM emp RIGHT OUTER JOIN dept
ON emp.deptno = dept.deptno
WHERE dept.dname = 'OPERATIONS'
/


Notan que agregué la palabra clave RIGHT OUTER a la cláusula del JOIN. Eso dice que la vuelta las filas a la JOIN (en este caso DEPT) aunque allí no es ninguna fila a la izquierda (en este caso EMP).

Podríamos reescribir la pregunta como tal:

SELECT dept.dname, emp.ename
FROM dept LEFT OUTER JOIN emp
ON dept.deptno = emp.deptno
WHERE dept.dname = 'OPERATIONS'
/


En este caso, pusimos el DEPT a la izquierda y utilizamos un LEFT OUTER ensamblamos para conseguir los mismos resultados.

Sunday, September 23, 2007

¿Cuál es un tipo de datos VARCHAR2?

VARCHAR2

VARCHAR2 es la secuencia del workhorse mecanografía adentro la base de datos de Oracle. VARCHAR2 es una secuencia de la longitud variable que debe tenerlo es longitud máxima declarada antes de usar. En Oracle 10g, una columna VARCHAR2 puede ser hasta 4000 octetos y puede ser hasta 32767 octetos en un programa de PL/SQL.

VARCHAR2 puede almacenar cualquier tipo de datos no-binarios. Dependiendo de la lengua definida en la base de datos (doble o multibyte), el número real de caracteres puede ser menos que el número de octetos. Por ejemplo, si la lengua requiere tres octetos por carácter, puedes almacenar más serías 32767 divididos por 3 caracteres.

Para declarar un VARCHAR2, puedes especificar el número de octetos o el número de caracteres. Especificar el número de caracteres si utilizas un juego de caracteres del multi-octeto. Si no, especificar los octetos.

Un declaración parece esto: VARCHAR2 (30) que declararían una secuencia de 30 octetos y son equivalentes a VARCHAR2 (BYTE 30). Declarar una cadena de caracteres 30, utilizar: VARCHAR2 (CHAR 30). En el juego de caracteres utilizo, VARCHAR2 (30), VARCHAR2 (BYTE 30) y VARCHAR2 (CHAR 30) almacenará exactamente el mismo número de caracteres.

En mis bases de datos, utilizo VARCHAR2 casi exclusivamente. La única vez que no utilizo VARCHAR2 es si necesito una secuencia grande (opinión para los documentos y tales) cuando utilizaré un CLOB. Cubriré CLOBs en el futuro.

Si necesito una variable de PL/SQL que sea más grande de 4000 octetos, sin embargo declararé a veces un LONG. UN PL/SQL LONG es sinónimo con VARCHAR2 (32760). No utilizo deseo en tablas mientras que CLOBs está mucho mejor. UN LONG en una tabla no es sinónimo con VARCHAR2 en todos.

¿Cuál es Oracle?

¿Conjeturo que la primera pregunta está realmente, “cuál es una base de datos”? Una base de datos es una recogida de datos organizada. Los datos pueden ser textuales, como datos de la orden o del inventario, o pueden ser los cuadros, los programas o todo lo demás que se pueden almacenar en una computadora en forma binaria.

Una base de datos emparentada almacena los datos bajo la forma de tablas y columnas. Una tabla es la categoría de datos, como empleado, y las columnas son información sobre la categoría, como nombre o la dirección.

Algunas bases de datos tienen sistemas mínimos de la característica y almacenan solamente datos, mientras que otras incluyen lenguajes de programación, instalaciones y utilidades para apoyar usos del empresa-nivel como ERP y el almacenamiento de los datos. Oracle es la base de datos #1 y tiene la característica más avanzada fijada.

Oracle se compone de un sistema de procesos que funcionan en tu sistema operativo. Estos procesos manejan cómo se almacenan los datos y cómo están alcanzados. Cubriré estos procesos detalladamente en el futuro; pero para ahora nosotros apenas necesitamos entender que Oracle sea un programa que está funcionando en el fondo, está manteniendo tus datos para ti y está calculando hacia fuera donde debe ir en tu impulsión dura.

En casi todas las bases de datos emparentadas, los datos están alcanzados con el SQL, o el lenguaje de interrogación estructurado, y Oracle no es ninguna excepción. El SQL permite que SELECT tus datos, nuevos expedientes del INSERT, que UPDATE expedientes existentes y que DELETE expedientes que deseas conseguir librado de. El SQL se puede encajar en otras idiomas o puedes funcionar las escrituras del SQL directamente contra la base de datos.

PL/SQL es la extensión de lengua procesal al SQL. PL/SQL es un lenguaje de programación como C, Java o PASCAL. En el mundo de Oracle, no hay manera mejor de tener acceso a tus datos por dentro de un programa. El SQL se puede encajar nativo en programas de PL/SQL. Utilizaré el SQL y PL/SQL muy pesadamente en mis artículos futuros.

PL/SQL es una lengua característica-rica engranada hacia usos de la base de datos que se convierten. PL/SQL es la lengua procesal de la base de datos, pero es también la lengua procesal para la mayor parte de las herramientas de Oracle. Los programas que funcionan dentro de la base de datos se llaman los procedimientos almacenados. Estos procedimientos almacenados son casi siempre PL/SQL, pero se pueden escribir en Java.

Friday, September 14, 2007

Introducción a SQL básico, parte 1

SQL, SEQUEL pronunciada, es la lengua de estándar para tener acceso a bases de datos emparentadas. SQL es una abreviatura para el lenguaje de interrogación estructurado. No dejar el hecho de que es un susto de la lengua tú. Usar su funcionalidad básica es muy simple.

Aun cuando SQL es un estándar, cada vendedor tiene sus propias extensiones y limitaciones. Oracle no es ninguna excepción. Hasta Oracle 9i, Oracle no apoyó estándar ensambla el sintaxis que fue apoyado por las bases de datos tan simples como MS-Access. Sin embargo, Oracle ha proporcionado siempre las extensiones que te hicieron una plataforma muy robusta para todo del acceso de usuario general a las preguntas ad hoc a los usos en tiempo real del alto rendimiento al almacenamiento de los datos.

En este artículo, cubriré el SQL básico. Las preguntas en este artículo funcionarán contra la mayoría de la cualquier base de datos de Oracle. Los objetos contra los cuales estamos preguntando diferencian entre los vendedores de la base de datos. Seguiré este artículo pronto con un artículo que describe más funcionalidad avanzada del SQL y cómo esa funcionalidad diferencia entre Oracle, MySQL y PostgreSQL.


El sintaxis más básico del SQL comienza con una cláusula y una a SELECTAS de la cláusula. Una cláusula SELECT dice a base de datos LO QUE deseas seleccionar. A FROM la cláusula dice a base de datos dónde encontrar que los datos.

Funcionar SQL*Plus (descrito en el artículo que mencioné arriba), conexión como cualquier usuario tienes disponible y entras:

SELECT table_name
FROM all_tables;


Cuando funciono mi pregunta, consigo una lista de las tablas seguidas por el texto “113 filas seleccionadas.”. La cláusula SELECT es TABLE_NAME y FROM cláusula son los all_tables. El punto y coma en el extremo dice a Oracle que hayas terminado tu comando. DEBES incorporar un punto y coma o una raya vertical antes de que Oracle te procese comando.

Esto era un comando muy útil pero podría ser hecho más útil. La lista de tablas era justa que, una lista. Si buscáramos una tabla específica, sería duro con una lista desordenada como eso. Intentemos poner una cierta orden a ella.

Entrar:

SELECT table_name
FROM all_tables
ORDER BY table_name
/



La autorización, allí es tres diferencias aquí. No hay punto y coma sino que hay una raya vertical, “/”. La raya vertical también dice a Oracle que hayas terminado un comando. La raya vertical debe aparecer la columna 1 del ion en una línea por sí mismo. Un punto y coma puede seguir dondequiera mientras no haya líneas en blanco entre él y el comando.

El tipo raya vertical en una línea por sí mismo y Oracle ejecutará nuevamente el comando anterior. Ahora intentarlo.

Autorización, también agregamos una ORDER BY cláusula a nuestro comando. La ORDER BY dice Oracle a, extrañamente bastante, pide el sistema del resultado. ¿Qué pidió cerca? TABLE_NAME.

Ahora que es mucho más útil. Puedes enrollar a través de la lista y encontrar una tabla específica. La voluta a través de ella ahora y encuentra la tabla, DUAL. Si no ves esta tabla, algo no se configura correctamente en tu base de datos ni se configura correctamente con tu usuario. DUAL es una tabla especial proporciona por Oracle. Debe siempre tener una fila y solamente tener una columna. Esa columna, DUMMY, debe siempre tener el valor “X”.

Entrar:

SELECT table_name
FROM all_tables
WHERE table_name = 'DUAL'
/



Debes conseguir solamente una sola fila detrás. Si consigues más que una sola fila, debes tener tablas DUALES múltiples en tu base de datos. Agreguemos una columna nueva a nuestro selecto:

SELECT table_name
FROM all_tables
WHERE table_name = 'DUAL'
AND OWNER = 'SYS'
/


SYS es un usuario muy especial. SYS posee la mayor parte de los objetos subyacentes en una base de datos.

Como puedes ver WHERE la cláusula limita los datos tú selecto. La oirás/lees te referiste como donde cláusula, línea del límite, línea de la restricción, etc.

Tan cómo sabía que la opinión de ALL_TABLES tenía el OWNER de la columna en ella.

Entrar:

DESC DUAL


El comando de DESC es un comando del SQL*Plus, no un comando del SQL. El comando del SQL*Plus y del SQL no es caso sensible. Ése es tú puede entrarlos en como mayúsculo, minúscula o cualquier combinación del caso. El texto en las cotizaciones, llamadas los literales, es caso sensible. El entrar del intento:

SELECT table_name
FROM all_tables
WHERE table_name = 'Dual'
/



No debes conseguir ninguna fila. ALL_TABLES, y la mayoría de las otras opiniones del diccionario de los datos, siempre datos del almacén en mayúscula. Hay una manera de crear objetos en un caso más bajo y mezclado pero considero que una tan mala práctica que no quisiera que fuera el que está para demostrarte cómo. ; -)

SQL proporciona las funciones útiles que puedes ejecutar en tu seleccionas para modificar datos. Suponer que deseamos encontrar el tercer carácter del nombre de la tabla para cada tabla. Entraríamos:

SELECT table_name, substr(table_name, 3, 1)
FROM all_tables
/


Puedes ver que hay dos columnas en ti lista de la vuelta. SUBSTR es una función del SQL que significa subsecuencia. Básicamente, vuelve un subconjunto del valor en una secuencia.

Si deseaste ver si un valor está en una secuencia podrías entrar:

SELECT table_name, instr(table_name, 'A')
FROM all_tables
/


INSTR es una función que encuentra la localización de una subsecuencia en una secuencia. La llamada de función antedicha dice vuelta la localización de la subsecuencia A para el table_name de la columna de los all_tables de la tabla. Si la columna nueva es un 0, ese nombre de la tabla no contiene un A. Si es un número más arriba de 0, que la primera localización en el nombre de la tabla del carácter A.

Y ése es SQL básico en una cáscara de nuez. Todo este sintaxis trabajará en la mayoría de la cualquier base de datos pero solamente Oracle tiene la tabla DUAL. Los diccionarios de los datos también varían entre las bases de datos. De una manera disimulada, también te he introducido a conceptos más avanzados de Oracle como la tabla DUAL y un diccionario de los datos.

Cubrimos hoy el SELECT, FROM, WHERE ORDER BY cláusulas del SQL. SELECT es CUÁL, FROM la FUENTE, WHERE está el LÍMITE y la ORDER BY es la ORDEN DE. Con estas cuatro cláusulas, puedes tener acceso apenas sobre cualquier base de datos emparentada en existencia.

Estoy trabajando en tres artículos para seguir éste. Un artículo demostrará cómo ejecutar las preguntas equivalentes presentadas en este artículo contra MySQL y PostgreSQL (y de tal modo describir sus diccionarios de los datos), una cubierta SQL avanzado del artículo (y cómo diferencian las otras bases de datos) y un artículo sobre tipos de datos.

Los tipos de datos son la base de cualquier base de datos. Oracle, MySQL y PostgreSQL ofrecen tipos de datos muy ricos. MySQL hace las cosas un pedacito complicado que PostgreSQL o Oracle. Explicaré lo que significo en el artículo próximo.

Puesto que he descrito los tres artículos que estoy trabajando actualmente encendido, fijar por favor a la discusión sobre este artículo que quisieras ver primero.

Saturday, September 8, 2007

Aprender PL/SQL: Procedimientos y funciones

Procedimientos CONTRA funciones

Los procedimientos son tradicionalmente el workhorse del mundo de la codificación y las funciones son tradicionalmente los pedazos más pequeños, más específicos del código. Generalmente si necesitas poner al día la carta de cuentas, escribirías un procedimiento. Si necesitas recuperar el código de la organización para una cuenta particular de GL, escribirías una función.

Aquí están algunas más diferencias entre un procedimiento y una función:

  • Una función DEBE volver un valor
  • Un procedimiento no puede volver un valor
  • Los procedimientos y las funciones pueden ambos datos de vuelta en IN y IN OUT parámetros
  • La declaración de vuelta en una función vuelve control al programa que llama y vuelve los resultados de la función
  • La declaración de vuelta de un procedimiento vuelve control al programa que llama y no puede volver un valor
  • Las funciones se pueden llamar de SQL, procedimiento no pueden
  • Las funciones se consideran las expresiones, procedimiento no son
Eso está sobre todas las diferencias que puedo pensar en de la tapa de mi cabeza. ¿Puedes pensar en más?

Parámetros

Los programas nombrados de PL/SQL (los procedimientos y las funciones) pueden tomar parámetros. Los parámetros se nombran las variables que están disponibles para un programa y que modifican comportamiento y/o datos del programa. Los parámetros son opcionales en procedimientos y funciones.

Se declaran los parámetros cuando un procedimiento o una función se declara y se declara entre paréntesis abiertos y cercanos (()).

Los parámetros pueden ser nombrados cualquier cosa que sigue Oracle que nombra estándares. Guardarlos bajo 30 caracteres, no deben comenzar con una letra y contener ningún espacio. Las reglas allí adicionales pero ésas son las que se violan lo más comúnmente posible.

Hay tres tipos de parámetro: IN, OUT y IN OUT.

IN parámetro se utiliza una entrada solamente. IN parámetro no puede ser cambiado por el programa llamado.

Un parámetro de la OUT es inicialmente NULL. El programa asigna a parámetro un valor y ese valor se vuelve al programa que llama.

IN OUT parámetro puede o no puede tener un valor inicial. Ese valor inicial se puede o no se puede modificar por el programa llamado. Cualquier cambio realizado al parámetro se vuelve al programa que llama.

Los parámetros se declaran con los tipos de datos pero sin el tipo de datos longitud o precisión. Eso significa que un parámetro se puede declarar como VARCHAR2 pero no será declarado con un componente de la longitud (VARCHAR2 (30) no sería válido).

Los parámetros se pueden también asignar un valor prefijado. Puedes o utilizar al operador de asignación (: =) o utilizar la palabra clave del DEFAULT. Cuando un parámetro tiene un valor prefijado, no necesitas incluir ese parámetro en la llamada. DEBES incluir siempre IN OUT y OUT los parámetros.

Declaraciones del parámetro de la muestra:

(
parameter_1 IN VARCHAR2 := 'ABC',
parameter_2 IN VARCHAR2 DEFAULT 'ABC',
parameter_3 IN OUT NUMBER,
parameters_can_be_named_anything OUT DATE
)


Referencia de parámetro

Los programas que llaman pueden referir a parámetros positionally o por la notación nombrada. Se considera una mejor práctica de referir a parámetros vía la notación nombrada. Casi nadie hace esto constantemente sin embargo (mismo incluido).

La notación posicional refiere a enumerar los parámetros por la posición que están declarados. Usando el ejemplo arriba, podríamos positionally referir a los parámetros como:

(“def”, “ghi”, v_number_variable, v_date_variable)

Para la notación nombrada, utilizarías el nombre real del parámetro. Esto es muy práctico para las listas grandes del parámetro y para esas listas del parámetro que tengan un montón de valores prefijados. Al usar la notación nombrada, los parámetros no tienen que ser enumerados en la orden del declaración.

(=> parameter_3 v_number_variable, parameter_1 => “def”, => v_date_variable v_date_variable)

Procedimientos

El procedimiento es un programa que realiza una acción y no vuelve un valor (afuera de EN HACIA FUERA y HACIA FUERA los parámetros).

Se declara un procedimiento como:


CREATE OR REPLACE PROCEDURE
([any parameters])
AS
[declare variables]
BEGIN
[execute code]
[handle exceptions]
END;


Un ejemplo simple del procedimiento de PL/SQL:

CREATE OR REPLACE PROCEDURE my_first_proc
(p_name IN VARCHAR2 := 'Lewis',
p_address IN VARCHAR2 := '123 Mockingbird Ln',
p_an_in_out_parameter IN OUT NUMBER,
p_an_out_parameter OUT DATE )
AS

v_a_variable VARCHAR2(30);

BEGIN
IF p_name = 'Lewis'
THEN
DBMS_OUTPUT.PUT_LINE( p_name || ': ' ||
p_address );
END IF;

v_a_variable := 99;
p_an_in_out_parameter := v_a_variable;
p_an_out_parameter := SYSDATE;

END;


Llamarías este procedimiento como:

DECLARE
v_employee VARCHAR2(30) := 'BillyBob';
v_number NUMBER := 22;
v_date DATE;
BEGIN

my_first_proc(
p_name => v_employee,
p_an_in_out_parameter => v_number,
p_an_out_parameter => v_date );

DBMS_OUTPUT.PUT_LINE(
v_employee || ', ' ||
to_Char(v_number) || ', ' ||
to_char(v_date) );

my_first_proc(
p_an_in_out_parameter => v_number,
p_an_out_parameter => v_date );

DBMS_OUTPUT.PUT_LINE(
v_employee || ', ' ||
to_Char(v_number) || ', ' ||
to_char(v_date) );

END;


Funciones

La función es un programa que pudo realizar una acción y vuelve un valor.

Se declara una función como:

CREATE OR REPLACE FUNCTION
([any parameters])
RETURN
AS
[declare variables]
BEGIN
[execute code]
[handle exceptions]
RETURN [variable or expression]
END;


Podemos convertir el procedimiento antedicho a una función y hacer que vuelve la variable que declara:

CREATE OR REPLACE FUNCTION my_first_func
(p_name IN VARCHAR2 := 'Lewis',
p_address IN VARCHAR2 := '123 Mockingbird Ln',
p_an_in_out_parameter IN OUT NUMBER,
p_an_out_parameter OUT DATE )

RETURN VARCHAR2

AS

v_a_variable VARCHAR2(30);

BEGIN
IF p_name = 'Lewis'
THEN
RETURN -1;
END IF;

v_a_variable := 99;
p_an_in_out_parameter := v_a_variable;
p_an_out_parameter := SYSDATE;

RETURN v_a_variable;

END;


Llamarías esta función como:

DECLARE
v_employee VARCHAR2(30) := 'BillyBob';
v_number NUMBER := 22;
v_date DATE;
v_variable VARCHAR2(30);
BEGIN

v_variable :=
my_first_func(
p_name => v_employee,
p_an_in_out_parameter => v_number,
p_an_out_parameter => v_date );

DBMS_OUTPUT.PUT_LINE(
v_variable || ', ' ||
v_employee || ', ' ||
to_Char(v_number) || ', ' ||
to_char(v_date) );

v_variable :=
my_first_func(
p_an_in_out_parameter => v_number,
p_an_out_parameter => v_date );

DBMS_OUTPUT.PUT_LINE(
v_variable || ', ' ||
v_employee || ', ' ||
to_Char(v_number) || ', ' ||
to_char(v_date) );

END;

My Zimbio
KudoSurf Me!