C'est ma procédure stockée SQL Server qui est ci-dessous:
CREATE PROCEDURE passenger_details
AS
BEGIN
SELECT Full_Name, Age, Nationality, Category, Airline_Name, Class_Type
FROM Passenger, Ticket, Airline, Class
WHERE Passenger.Passenger_No=Ticket.Passenger_No AND Airline.Airline_No=Ticket.Airline_No AND Class.Class_No=Ticket.Class_No
END
EXECUTE passenger_details
La procédure stockée ci-dessus dans SQL Server fonctionne correctement.
Ensuite, j'ai essayé d'exécuter la même procédure stockée dans Oracle PL/SQL, comme indiqué ci-dessous:
CREATE OR REPLACE PROCEDURE passenger_details
(p_passenger_details OUT SYS_REFCURSOR)
AS
BEGIN
OPEN p_passenger_details FOR
SELECT Full_Name, Age, Nationality, Category, Airline_Name, Class_Type
FROM Passenger, Ticket, Airline, Class
WHERE Passenger.Passenger_No=Ticket.Passenger_No AND Airline.Airline_No=Ticket.Airline_No AND Class.Class_No=Ticket.Class_No;
END passenger_details;
La procédure stockée ci-dessus dans Oracle PL/SQL est compilée avec succès.
Ensuite, j'ai essayé de l'exécuter, comme indiqué ci-dessous:
SET SERVEROUTPUT ON;
EXECUTE passenger_details;
En essayant d'exécuter la procédure stockée, j'obtiens le message d'erreur suivant qui est affiché ci-dessous:
Error starting at line : 12 in command -
BEGIN passenger_details; END;
Error report -
ORA-06550: line 1, column 7:
PLS-00306: wrong number or types of arguments in call to 'PASSENGER_DETAILS'
ORA-06550: line 1, column 7:
PL/SQL: Statement ignored
06550. 00000 - "line %s, column %s:\n%s"
*Cause: Usually a PL/SQL compilation error.
*Action:
Vous pouvez utiliser dbms_sql
pour renvoyer des résultats implicites. Il s'agit d'une fonctionnalité ajoutée à Oracle 12 pour faciliter la migration à partir de SQL Server:
CREATE PROCEDURE passenger_details
AS
c1 SYS_REFCURSOR;
BEGIN
open c1 for
SELECT Full_Name, Age, Nationality, Category, Airline_Name, Class_Type
FROM Passenger
JOIN Ticket on Passenger.Passenger_No = Ticket.Passenger_No
JOIN Airline ON Airline.Airline_No = Ticket.Airline_No
JOIN Class ON Class.Class_No = Ticket.Class_No;
DBMS_SQL.RETURN_RESULT(c1);
END;
/
Notez que I remplacé les jointures implicites anciennes et obsolètes avec un opérateur explicite JOIN
.
Vous devez passer un REFCURSOR
pour que la procédure l'utilise comme paramètre de sortie (OUT
).
Procédure rapide pour tester avec:
CREATE OR REPLACE PROCEDURE passenger_details
(p_passenger_details OUT SYS_REFCURSOR)
AS
BEGIN
OPEN p_passenger_details FOR
SELECT 'test test' as Full_Name, 10 as Age, 'alien' as Nationality, 'foo' as Category,
'Name' as Airline_Name, 'wobble' as Class_Type
FROM dual;
END passenger_details;
/
Testez dans SQL * Plus:
SQL> variable mycursor refcursor; SQL> exec passager_détails (: mon curseur); Procédure PL/SQL terminée avec succès. SQL> imprimer mon curseur; FULL_NAME AGE NATIO CAT AIRL CLASS _ --------- ---------- ----- --- - - ------ test test 10 alien foo Nom wobble SQL>