Wcześniej pracowałem z Firebird i tam można było wykonać procedurę
poprzez wywołanie np. "select * from moja_procedura". Chciałem to samo
zrobić z procedurą na Oracle ale coś nie idzie. Czy da się w ten
sposób wykonać? Konkretnie chodzi mi o taki typ wykonywania procedur.
Procedura:
create or replace PROCEDURE PROC_test
AS BEGIN
DBMS_OUTPUT.PUT_LINE('poszlo');
END PROC_test;
Procedurę wykonuję tak: select * from proc_test;
Błąd:
Error starting at line 1 in command:
select * from proc_test
Error at Command Line:1 Column:14
Error report:
SQL Error: ORA-04044: procedure, function, package, or type is not
allowed here
04044. 00000 - "procedure, function, package, or type is not allowed
here"
*Cause: A procedure, function, or package was specified in an
inappropriate place in a statement.
*Action: Make sure the name is correct or remove it.
> Witam
>
> Wcze�niej pracowa�em z Firebird i tam mo�na by�o wykona� procedur�
> poprzez wywo�anie np. "select * from moja_procedura". Chcia�em to samo
> zrobiďż˝ z procedurďż˝ na Oracle ale coďż˝ nie idzie. Czy da siďż˝ w ten
> spos�b wykona�? Konkretnie chodzi mi o taki typ wykonywania procedur.
Oracle to nie firebird, zr�b :
select moja_procedura from dual;
zreszt� to i tak nie p�jdzie, zrob funkcje zwracaj�c� warto�� i wtedy:
select moja_funkcja from dual;
Dzięki za odpowiedź
Z dual już próbowałem i tez nie idzie
Nie chce funkcji tylko procedurę. Czyli nie ma możliwości wykonania
procedury poprzez select-a?
> Witam
>
> Wcze=B6niej pracowa=B3em z Firebird i tam mo=BFna by=B3o wykona=E6 procedur=
> =EA
> poprzez wywo=B3anie np. "select * from moja_procedura". Chcia=B3em to samo
> zrobi=E6 z procedur=B1 na Oracle ale co=B6 nie idzie. Czy da si=EA w ten
> spos=F3b wykona=E6? Konkretnie chodzi mi o taki typ wykonywania procedur.
>
> Procedura:
> create or replace PROCEDURE PROC_test
> AS BEGIN
> DBMS_OUTPUT.PUT_LINE('poszlo');
> END PROC_test;
>
> Procedur=EA wykonuj=EA tak: select * from proc_test;
> B=B3=B1d:
>
> Error starting at line 1 in command:
> select * from proc_test
> Error at Command Line:1 Column:14
> Error report:
> SQL Error: ORA-04044: procedure, function, package, or type is not
> allowed here
> 04044. 00000 - "procedure, function, package, or type is not allowed
> here"
> *Cause: A procedure, function, or package was specified in an
> inappropriate place in a statement.
> *Action: Make sure the name is correct or remove it.
>
>
Bo to tak nie dzia�a.
Chcesz u�y� tzw. table functions. Mo�esz o tym poczyta� np. tu:
http://download.oracle.com/docs/cd/B19306_01/appdev.102/b14261/tuning.htm#sthref2335
Poni�ej prosty przyk�ad:
SQL> CREATE TYPE t_messages AS TABLE OF VARCHAR2(100)
2 /
Type created.
SQL> CREATE OR REPLACE FUNCTION test_fun RETURN t_messages PIPELINED
2 AS
3 BEGIN
4 pipe row('poszlo');
5 return ;
6 END;
7 /
Function created.
SQL> SELECT * FROM TABLE(test_fun);
COLUMN_VALUE
---------------
poszlo
--
Wys�ano z serwisu Usenet w portalu Gazeta.pl -> http://www.gazeta.pl/usenet/
>Witam
>
>Wcze�niej pracowa�em z Firebird i tam mo�na by�o wykona� procedur�
>poprzez wywo�anie np. "select * from moja_procedura". Chcia�em to samo
>zrobiďż˝ z procedurďż˝ na Oracle ale coďż˝ nie idzie. Czy da siďż˝ w ten
>spos�b wykona�? Konkretnie chodzi mi o taki typ wykonywania procedur.
>
>Procedura:
>create or replace PROCEDURE PROC_test
>AS BEGIN
> DBMS_OUTPUT.PUT_LINE('poszlo');
>END PROC_test;
>
>Procedurďż˝ wykonujďż˝ tak: select * from proc_test;
No to wykonuj tak.
Ad-hoc np. z SQL*Plus
exec proc_test;
albo jako blok anonimowy:
begin
proc_test;
end;
/
Jak chcesz uruchamiaďż˝ z zapytania, to ma to byďż˝ funkcja, a nie procedura.
Wtedy select zwraca to co funkcja mu przeka�e np.
select substr('tekst', 1, 2) as wynik from dual;
--
S�awomir Szysz�o
Primus inter FAQires & Grand Inquisitor no.0 of pl.comp.bazy-danych
FAQ pl.comp.bazy-danych http://www.dbf.pl/faq/
Archiwum http://groups.google.com/groups?group=pl.comp.bazy-danych
Tworzymy pakiet, wrzucamy do niego funkcje, z pragmą WNDS - to
znaczy, że nie będziemy zmieniać stanu bazy-zadne delety, inserty, ,
updaty, dynamiczne SQL i inne kombinacje
create or replace package TEST is
function myProc(n IN number) return number;
pragma restrict_references(myProc, WNDS); -- to jest istota
rozwiązania
end random;
/
create or replace package body TEST
is
function myProc(n IN number) return number IS
begin
return n*n;
end;
end TEST;
/
A jak wywołać własną funkcję??
select test.myProc(2) from dual
Jest wiele ciekawych zastosowań dla funkcji pragmowych jak się
wgłębisz - powinieneś się przekonać, np. w sposób istotny upraszczaja
one raportowanie
pozdrawiam
kazik