wypisanie wartości z kursora poprzez funkcję

0

Witam wszystkich..
Chciałbym prosić o pomoc w rozwiązaniu problemu. Bardzo chciałem zrobić funkcję która zwraca cały kursor i teoretycznie mi się to udało. Problem w tym że nie wiem jak to teraz uruchomić w bloku anonimowym.. tzn uruchomiłem i wyświetliło mi cały ostatni wiersz kursora. Pytanie brzmi jak się teraz odwołać do paczki i kursora aby w bloku anonimowym wyświetlić wszystkie wiersze zaczytane z kursora.
to jest wynik wykonania bloku anonimowego:
EMPLOYEE_ID:13 MANAGER_ID:10 FIRST_NAME:Klaudia LAST_NAME:Prewał SALARY:47002
gdzie EMPLOYEE_ID:13 jest ostatnim w całej tabeli.

create or replace PACKAGE emp_admin AS
--zmienne globalne
TYPE EmpRecTyp IS RECORD (EMPLOYEE_ID NUMBER(38,0),MANAGER_ID NUMBER(38,0),FIRST_NAME VARCHAR2(10 BYTE),LAST_NAME VARCHAR2(10 BYTE),TITLE VARCHAR2(20 BYTE),SALARY NUMBER(6,0));
CURSOR desc_salary RETURN EmpRecTyp;
--deklaracja funkcji
FUNCTION nth_highest_salary RETURN EmpRecTyp;
END emp_admin;

create or replace PACKAGE BODY emp_admin AS
--pełna deklaracja kursora
CURSOR desc_salary RETURN EmpRecTyp IS
SELECT * FROM MORE_EMPLOYEES;
--pełna deklaracja funkcji
FUNCTION nth_highest_salary RETURN EmpRecTyp IS
emp_rec EmpRecTyp;
BEGIN
OPEN desc_salary;
LOOP
FETCH desc_salary INTO emp_rec;
EXIT WHEN desc_salary%NOTFOUND;
END LOOP;
CLOSE desc_salary;
RETURN emp_rec;
END nth_highest_salary;
END emp_admin;

DECLARE
v_variable MORE_EMPLOYEES%ROWTYPE;
BEGIN
v_variable := EMP_ADMIN.NTH_HIGHEST_SALARY;
DBMS_OUTPUT.PUT_LINE('EMPLOYEE_ID:'||v_variable.employee_id||' MANAGER_ID:'||v_variable.manager_id||' FIRST_NAME:'||v_variable.first_name||' LAST_NAME:'||v_variable.last_name||' SALARY:'||v_variable.salary);
END;

1

Ta funkcja nie zwraca kursora a jeden rekord. Jeśli chcesz zwracać zbiór rekordów to musisz użyć tablicy rekordów, ref cursora albo funkcji pipelined (w zależności od tego czy chcesz to wywoływać z PL/SQL czy SQL).
Jeśli chcesz mieć podgląd na to co funkcja zwróci, to możesz dać output wewnątrz pętli. Ale to nie jest zwracanie kursora.

0

CREATE OR REPLACE FUNCTION funkcjaSysRefcursor(x in MORE_EMPLOYEES.MANAGER_ID%TYPE,y in MORE_EMPLOYEES.MANAGER_ID%TYPE) RETURN SYS_REFCURSOR AS
kursor SYS_REFCURSOR;
zapytanie VARCHAR2(100);
BEGIN
zapytanie:= 'SELECT * FROM MORE_EMPLOYEES WHERE MANAGER_ID BETWEEN '||x||' and '||y||' ORDER BY MANAGER_ID';
OPEN kursor FOR zapytanie;
RETURN kursor;
END;

DECLARE
kursor SYS_REFCURSOR;
v_variable employees%rowtype;
begin
kursor := funkcjaSysRefcursor (6,10);
LOOP
FETCH kursor INTO v_variable;
EXIT WHEN kursor%NOTFOUND;
DBMS_OUTPUT.PUT_LINE('EMPLOYEE_ID:'||v_variable.employee_id||' MANAGER_ID:'||v_variable.manager_id||' FIRST_NAME:'||v_variable.first_name||' LAST_NAME:'||v_variable.last_name||' SALARY:'||v_variable.salary);
END LOOP;
DBMS_OUTPUT.PUT_LINE('------------------------------------------------');
kursor := funkcjaSysRefcursor (1,3);
LOOP
FETCH kursor INTO v_variable;
EXIT WHEN kursor%NOTFOUND;
DBMS_OUTPUT.PUT_LINE('EMPLOYEE_ID:'||v_variable.employee_id||' MANAGER_ID:'||v_variable.manager_id||' FIRST_NAME:'||v_variable.first_name||' LAST_NAME:'||v_variable.last_name||' SALARY:'||v_variable.salary);
END LOOP;
END;

i to ogólnie działa.. zwraca mi referencje do kursora, a właściwie chyba do zapytania.. i wyświetla mi wszystkie rekordy.. tylko teraz za bardzo nie wiem jak to zamknąć wszystko w paczkach, a właściwie zadeklarować w paczkach..

0

To może inaczej - jaki ogólny problem chcesz rozwiązać? Do czego ma być ta funkcja?
DBMS_OUTPUT to taki raczej diagnostyczny pakiet, normalnie w aplikacjach nie zwraca się danych w ten sposób (i tak idzie to tylko na konsolę czy do logu).

P.S.
Używaj znaczników "kod źródłowy" do formatowania kodu na forum.

0
robertos7778 napisał(a):

To może inaczej - jaki ogólny problem chcesz rozwiązać? Do czego ma być ta funkcja?
DBMS_OUTPUT to taki raczej diagnostyczny pakiet, normalnie w aplikacjach nie zwraca się danych w ten sposób (i tak idzie to tylko na konsolę czy do logu).

P.S.
Używaj znaczników "kod źródłowy" do formatowania kodu na forum.

nie rozwiązuję jakiegoś konkretnego problemu.. ćwiczę różne zagadnienia, możliwości.. i tak wymyśliłem sobie funkcję która zwraca kursor.. dopiero zaczynam z plsql-em więc mogę mylić pojęcia lub wydaje mi się że coś zrobiłem dobrze.. korzystam z tego co w internecie.. czasem sam wymyślam.. nie wiem jak to funkcjonuje normalnie w aplikacjach.. czy mógłbym prosić o jakiś prosty przykład...?
i zapytam przy okazji... nie udzielasz przypadkiem korepetycji..?

1 użytkowników online, w tym zalogowanych: 0, gości: 1