Foro oficial de SQL

Que buen dato!

Muchas Gracias.

Ahora tengo otra duda!

El procedimiento lo tengo que llamar desde PHP así:

procedure_x(a in varchar2, b out number)

Necesito que el procedimiento retorne o entregue en la salida el valor de las filas modificadas.

Intenté algo así: procedure_x('abc',:b) para obtener el parámetro de salida, pero no me funciona ni en consola, que hay que hacer para devolver la cantidad de filas sin usar DBMS_OUTPUT.put_line si no como un parámetro de salida del procedimiento?

pues tienes varias formas
asignarlo al parámetro de salida o en vez de un procedimiento crear una función que retorne un número

con parámetro salida:
update...
parsalida:= SQL%ROWCOUNT;

con función:
update..
return SQL%ROWCOUNT;

SQL%ROWCOUNT lo puedes asignar a una variable numérica y trabajarla como tal
suerte
 
Muchas Gracias.

Necesito que sea un procedimiento almacenado.

Mira como lo creo:


CREATE OR REPLACE PROCEDURE stpInsert_arch(NAMEO IN VARCHAR2, BYTES IN NUMBER, CBYTES IN NUMBER, SPACE IN VARCHAR2, CSPACE IN VARCHAR2, CONTENT IN CLOB, USER IN VARCHAR2, IPO IN VARCHAR2, MACHINE IN VARCHAR2, PID IN VARCHAR2, ID OUT NUMBER)
IS
BEGIN

INSERT INTO tblArchivo
(id_archivo,nombre,bytes,bytes_comprimido,espacio,espacio_comprimido,contenido,usuario,ip,estacion,programa,fecha)
VALUES
(AUTO_INCREMENT_TBLARCHIVO.NextVal,NAMEO,BYTES,CBYTES,SPACE,CSPACE,Empty_Clob(),USER,IPO,MACHINE,PID,SYSDATE);

COMMIT;

ID:=SQL%ROWCOUNT;

END;


Al momento de crearlo no me saca ningún error, la cuestión es que cuando intento probar el procedimiento ejecutandolo con:

CALL stpInsert_arch('Name',2,1,'10 KB','2 KB','AAA','USER','10.4.6.247',maquina','200',1);
Me saca un error de que el parámetro de salida debe ser una bind variable. (ORA-06577)

CALL stpInsert_arch('Name',2,1,'10 KB','2 KB','AAA','USER','10.4.6.247','maquina','200',NULL);
Me saca un error diciendo que no le pase todos los parametros (ORA-06553)

CALL stpInsert_arch('Name',2,1,'10 KB','2 KB','AAA','USER','10.4.6.247','maquina','200',:a);
Me saca un error diciendo no todas las variables bound (ORA-01008)

La pregunta es? que tengo malo o como lo debo llamar usando el CALL?

Muchas Gracias.
 
Hola, necesito ayuda con llaves forneas en MySQL, la cuestión es, si tengo una base de datos en la cual hay dos esquemas; "esquema1" el cual contiene la tabla: "tabla1" y "esquema2" que a su vez contiene la tabla "tabla2" ¿como relaciono la llave foranea entre "tabla1" y "tabla2"?

He estado buscando en la red, pero no encuentro. Gracias
 
Ya casi logro insertar el LOB, pero aun me sale un pequeño error:

Este es el procedimiento:

CREATE OR REPLACE PROCEDURE SAVE_DATA(THE_CLOB OUT CLOB) IS
BEGIN
INSERT INTO MY_TABLE (MY_CLOB) VALUES (EMPTY_CLOB()) RETURNING MY_CLOB
INTO THE_CLOB;
END;

este es el código php:

<?php
$data = '1234568790';
$conn = oci_connect($user, $password);
$stmt = oci_parse($conn, "begin save_data:)data); end;");

$clob = oci_new_descriptor($conn, OCI_D_LOB);
oci_bind_by_name($stmt, ":data", $clob, -1, OCI_B_CLOB);
oci_execute($stmt, OCI_DEFAULT);
$clob->save(data);
oci_commit($conn);
$clob->free();
oci_free_statement($stmt);
?>

Teoricamente está bien y debería funcionar, pero me sale el siguiente error:

Warning: OCI-Lob :: save() [function.OCI-Lob-save]: ORA-22990: LOB locators cannot span transactions
 
Pero este es de SQL, no hay uno de SQL Sever?? ya que aqui veo mucho codigo d MySQL...
Es que al decir SQL Server se entiende como Microsoft SQL Server, y aunque hay versiones express (Que querrán decir), no son gratis (Favor de leer EULA).
MySQL (Que tampoco es gratis, pero es Libre) es muy Popular.
Yo veo mucho PHP + *server.
A mi me gusta ProgreSQL, MySQL, FireBird y SQLite.
 
Ya.... pues me uno al forito... =)


Para inicar, tengo una dudilla....

Los Triggers son los que se usan para controlar los inventarios (mas o menos por poner un ejemplo)?? o sea, que cuando se hace una factura se descuenta del inventario.... y si la cantidad solicitada no esta disponible se dispara...



SuerteX :)
 
Te voy a hablar de lo que entiendo y todo sobre Oracle porque es la que mas manejo....


Un Trigger en PLSQL es un tipo especial de procedimiento almacenado asociado con una tabla de la base de datos Oracle y que se "dispara" (is triggered) cada vez que se ejecuta sobre dicha tabla una sentencia INSERT, una sentencia UPDATE o una sentencia DELETE, es decir, es un procedimiento que permite realizar distintas operaciones cuando un registro de una tabla Oracle es actualizado o borrado, o cuando se añade un registro nuevo a dicha tabla.



Hay muchas circunstancias en las que el uso de un trigger PL/SQL puede ser extremadamente útil, por ejemplo:

- Cuando los datos de una tabla son generados desde otro tipo de procedimientos y se necesita controlar los valores que toman algunos campos determinados de la tabla en cuestión.

- Para duplicar los contenidos de una tabla automáticamente y en tiempo real.

- Para implementar complejas restricciones sobre los valores que pueden tomar los campos de una tabla Oracle, es decir, cuando los CONSTRAINTS que se pueden definir sobre una tabla son insuficientes.

- Para controlar las modificaciones de los valores de los campos de una tabla (auditorías).

- Para incrementar automáticamente los valores de un campo.

- Para realizar actualizaciones de una tabla en cascada.

- Para modificar campos o registros de una tabla que un usuario no puede modificar directamente.

Los triggers PL/SQL constituyen una potente herramienta para mantener la integridad de la base de datos, ya que pueden llevar a cabo cualquier acción que sea necesaria para el mantenimiento de dicha integridad.

Los triggers PLSQL pueden llamar a otros procedimientos y disparar otros triggers, pero no admiten parámetros y no pueden ser invocados desde otros
procedimientos PLSQL.

Ventajas de los triggers PL/SQL

Estandarización: Un solo procedimiento controla las acciones que pueden realizar el resto de procedimientos sobre una tabla Oracle específica.

Eficiencia: Cuando un trigger es analizado por el optimizador Oracle, el
plan de ejecución se almacena en la memoria virtual del servidor, con lo cual, si se vuelve a disparar el trigger PLSQL, este se ejecuta instantáneamente ya que existe una copia del plan de ejecución en la memoria.

Seguridad: Aumentan la seguridad porque permiten restringir el acceso de los usuarios a los datos de las tablas, al no poder éstos modificar o acceder a los mismos directamente. Las acciones que realiza un trigger normalmente se limitan en base a los permisos que tiene el usuario que creo la tabla involucrada y no en base a los permisos que tiene el usuario que disparó el trigger.
 
Uyyy... man gracias por la info... ;), por cierto cual es mas incomodo de aprender, Oracle o SQL Server?? :rolleyes:


Lo digo porque es porque son los dos SGDB mas usados en mi pais, y por eso son los que mas me interesan....


SuerteX :)
 
No precisamente incómodo

Uyyy... man gracias por la info... ;), por cierto cual es mas incomodo de aprender, Oracle o SQL Server?? :rolleyes:


Lo digo porque es porque son los dos SGDB mas usados en mi pais, y por eso son los que mas me interesan....


SuerteX :)

En mi muy particular opinión, Oracle. Yo también lo he usado (actualmente uso más SQL Server). Oracle es diferente en muchos aspectos, una diferencia principal son los campos autonuméricos, que en SQL Server se especifican fácilmente con una opción al momento de diseñar la tabla, mientras que en Oracle debes hacerlos a través de disparadores (triggers).

En otras palabras, de alguna manera Oracle es más "complicado" de aprender que SQL Server.

Saludos.
 
consulta sql server

CONSULTA SQL
HOLA SABES QUISIERA HACERTE UNA PREGUNTA ESPERO ME PUEDAS ENTENDER:
BASICAMENTE TENGO 2 TABLAS PEDIDOS Y CLIENTES ENLAZADAS EN LA TABLA PEDIDOS SE GUARDA EL CODIGOS DE LOS CLIENTES Y LA CONSULTA Q QUEIRO RESOLVER ES EL CLIENTE Q MAS PEDIDOS TIENE O DICIENDOLO EN CRISTIANO EL CODIGO DE CLIENTE Q MAS APARECE EN LA TABLA PEDIDOS, PERO LO QUIERO HACER SIN TENER Q CREAR VISTAS SOLO LA CONSULTA PORQUE LO HICE ASI

CREATE VIEW MAXIMO
AS
SELECT COUNT(CUSTOMER_ID) AS ORDENES
FROM CUSTOMER_ORDERS
GROUP BY CUSTOMER_ID


DESPUES HICE ESTO::::

SELECT DISTINCT(C.CUSTOMER_NAME + " " + C.CUSTOMER_PHONE )
FROM CUSTOMERS C, CUSTOMER_ORDERS CO
WHERE CO.CUSTOMER_ID = C.CUSTOMER_ID AND CO.CUSTOMER_ID = ( SELECT MAX(ORDENES)

FROM MAXIMO)
------------------------------
Y ME DIO RESULTADO PERO QUIERO HACERLO SIN TENER Q CREAR UNA VISTA XQ NO VOY A ESTAR CREANDO VISTAS A CADA MOMENTO ME DIJERON Q META LA SINTAXIS DE LA VISTA EN EL FROM QUE ESTA ANIDADO EN LA CONSULTA ALGO ASI

SELECT DISTINCT(C.CUSTOMER_NAME + " " + C.CUSTOMER_PHONE )
FROM CUSTOMERS C, CUSTOMER_ORDERS CO
WHERE CO.CUSTOMER_ID = C.CUSTOMER_ID AND CO.CUSTOMER_ID = ( SELECT MAX(CUSTOMER_ID)

FROM ( SELECT COUNT(CUSTOMER_ID) FROM CUSTOMER_ORDERS
GROUP BY CUSTOMER_ID
))


PERO ME SALE UN ERROR en el parentesis algo asi me dice SQL SERVER
AGRADECERIA MUCHO QUE ME PUDIERAS AYUDAR

MUCHAS GRACIAS DE ANTEMANO
 
Bueno pruebe si es codigo que mas aparesca en la tabla pedidos asi:

Select count(codigocliente) from pedidos where Cliente.codigocliente=Pedido.codigocliente
 

Los últimos temas