Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Oracle wykonanie procedury poprzez select * from moja_procedura

56 views
Skip to first unread message

Wito

unread,
May 7, 2009, 2:11:51 AM5/7/09
to
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;
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.

Michal[K]

unread,
May 7, 2009, 2:27:45 AM5/7/09
to
Wito pisze:

> 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;

Wito

unread,
May 7, 2009, 2:41:06 AM5/7/09
to
On 7 Maj, 08:27, "Michal[K]" <mk...@interia.pl> wrote:
> Wito pisze:

>
> > 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?

Marcin Wróblewski

unread,
May 7, 2009, 2:44:52 AM5/7/09
to
Wito <wolew...@gmail.com> napisaďż˝(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/

Sławomir Szyszło

unread,
May 7, 2009, 2:22:05 PM5/7/09
to
Dnia Wed, 6 May 2009 23:11:51 -0700 (PDT), Wito <wolew...@gmail.com>
wklepaďż˝(-a):

>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

szkaradnik

unread,
May 7, 2009, 3:55:19 PM5/7/09
to

Kod pisałem z głowy, mogłem się gdzieś pomylić:

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

0 new messages