ugrás a tartalomhoz

ORACLE PL/SQL

aspirany · 2009. Jan. 24. (Szo), 12.01
Sziasztok!

Oracle 10g procedurát készítek de hibát generál a véglegesítésnél.

a kód :
PROCEDURE APRIL.SP_UGYFEL_KERES   (pugyfelnev   partner.partnernev%type)
IS
BEGIN
 SELECT * FROM partner WHERE partnernev LIKE pugyfelnev;
END sp_ugyfel_keres;


elég egyszerű lenne :) a hiba amivel elszáll:

szükség van INTO utasításra ebben a select utasításban.

köszönöm a válaszokat.
 
1

Logikus

deejayy · 2009. Jan. 26. (H), 11.28
Természetesen, hiszen PL/SQL-ben írod, nem SQL-ben. Tárolt eljárás nem ad vissza rekordokat, csakis plaintextet. (sajnos ez nem mssql... :\)
2

REF Cursor

zila · 2009. Jan. 26. (H), 17.33
Természetesen visszaadhat rekordsetet, pontosabban egy kurzort, és azt az alkalmazásban kb. ugyanúgy kezeled mint a rekordsetet...
3

köszönöm

aspirany · 2009. Jan. 26. (H), 18.35
Igen ez a lekérdezés működik mysql-ben de nem értettem az oracle miért kéri az into-t.

Még egy kérdésem lenne.PL/SQL vissza adhat-e több sort?

pl:SLECT nev FROM nevek WHERE nev LIKE 'xyz%'

lehte hogy hülyeség volt a kérdés akkor elnézést :)
4

REF Cursor újra :)

zila · 2009. Jan. 28. (Sze), 13.15
7

Átnéztem,de nem működik

aspirany · 2009. Jan. 29. (Cs), 09.44
A legelső linkről ezt a kódot hoztam össze:

PACKAGE HR.REFCURSOR_PKG    as
  TYPE REF_CURSOR IS REF CURSOR RETURN dolgozo%ROWTYPE;
end REFCURSOR_PKG;


procedure HR.PROCEDURE4   ( p_deptno IN VARCHAR
, p_cursor OUT REFCURSOR_PKG.REF_CURSOR)
is
begin
  open p_cursor FOR
  select *
  from   dolgozo
  where  job_id = p_deptno;
end procedure4;


amikor létrehoztam őket nem dobott hibát,de nem tér vissza semmilyen adattal.

Köszönöm a segítséget
8

Nem jó a példakód :)

zila · 2009. Jan. 29. (Cs), 11.16
create or replace package REFCURSOR_PKG as
  TYPE STRONG_REF_CURSOR IS REF CURSOR RETURN dolgozo%ROWTYPE;
end REFCURSOR_PKG;
-- itt a típus neve STRONG_REF_CURSOR, a példában kimaradt egy _ :)

create or replace procedure test( p_deptno IN number
                                , p_cursor OUT REFCURSOR_PKG.STRONG_REF_CURSOR)
is
begin
  open p_cursor FOR 
  select *
  from   dolgozo
  where  job_id = p_deptno;
end test;
Ezen kívül persze a kurzort előállító lekérdezésnek eredményt kell adnia, ha nem megy, akkor még látni kéne azt a kódot, ami az alkalmazásodban felhasználná a ref cursor-t, vagyis olvasná a visszaadott rekordokat a kurzorból...
9

köszönöm a kódot kiprób.

aspirany · 2009. Jan. 29. (Cs), 14.27
köszönöm a kódot, kipróbálom.

Ami a kimenetet feldolgozná az php lenne.
5

Ez így kissé pongyola

zila · 2009. Jan. 28. (Sze), 13.35
A tárolt eljárásoknak lehetnek IN, OUT és IN/OUT paraméterei. Az OUT paraméterek-ben adhat vissza adatot a db. Ezek tetszőleges típusúak lehetnek (nem csak plaintext, hanem integer, number, varchar2, date, timestamp, ref cursor, rekord, saját típus, blob/clob stb.)

Ha rekord visszaadásra van szükség akkor használható a ref cursor típusú OUT paramétert lehet használni.

Amiért INTO-t követel a db, az az, hogy a sima select-tel pl/sql-ben nem tud mit kezdeni, annak eredményét változókba/rekordokba kell tenni, vagy valami ciklusvezérlésre kell használni. Ezért teljesen jogosan mondja, azt, hogy nem érti mit akarsz azzal a selecttel... Nyilván lehet rajta vitatkozni, nekem sokkal egyértelműbb, olvashatóbb lesz így a kód (már amennyire egy pl/sql kód olvasható :) mintha a select eredményét simán visszaadná.
6

Így Érthető!

aspirany · 2009. Jan. 28. (Sze), 16.05
Köszönöm mindenkinek a hozzászólásokat.