Paweł Iwiński

Paweł Iwiński Student,
Politechnika
Rzeszowska im.
Ignacego
Łukasiewicza

Temat: Dynamiczny SQL - klauzula Execute Immediate.

Witajcie, mam problem z klauzulą execute immediate. Otóż muszę wykonać kilka skryptów SQL poprzedzając je tą właśnie klauzlą. Z tego co mi wiadomo to polecenie przyjmuje varchara i może nim być każde polecenie SQL, a w szczególności update, inserty, create i inne nawet where. Niestety w praktyce tylko proste zapytania działają z execute immediate np. zapytanie:
EXECUTE IMMEDIATE 'SELECT * FROM Orders'; wykonuje się poprawnie.

W przypadku tych bardziej skomplikowanych zapytań gdzie używany jest np. where lub join występuje błąd składniowy (w połączeniu z execute immediate) - sprawdzałem też w sqldeveloperze. Prawdopodobnie, gdy używa się klauzuli execute immediate wymagana jest nieco inna składnia całego zapytania niż tylko wzięcie w apostrofy głównego zapytania poprzedzając go execute immediate.

Może ktoś z was wie jak powinny wyglądać składniowo poniższe skrypty (z wykorzystaniem execute immediate, bez tej klauzuli zapytania oczywiście są poprawne składniowo).

1. SELECT o.order_id, c.customer_id, FROM orders o JOIN customers c ON (o.customer_id = c.customer_id);
2. UPDATE orders SET ORDER_TOTAL = ORDER_TOTAL * 1.01 WHERE (ORDER_ID > 3670 AND ORDER_ID < 4000);

Zbudowanie zapytania np. w ten sposób jest niepoprawne: EXECUTE IMMEDIATE ' UPDATE orders SET ORDER_TOTAL = ORDER_TOTAL * 1.01 WHERE (ORDER_ID > 3670 AND ORDER_ID < 4000)';
ale takie zapytanie już działa: EXECUTE IMMEDIATE 'SELECT * FROM Orders'; (ten przykład był podany przeze mnie wyżej, ale podaję jeszcze raz dla jasności).

Z góry dzięki za odpowiedzi.

konto usunięte

Temat: Dynamiczny SQL - klauzula Execute Immediate.

zrób sobie print-a tego co chesz wykonać
skopuj i uruchom normalnie, bo np. nie masz gdzieś znaku ' ograniczającego tekst
Paweł Iwiński

Paweł Iwiński Student,
Politechnika
Rzeszowska im.
Ignacego
Łukasiewicza

Temat: Dynamiczny SQL - klauzula Execute Immediate.

Przemysław R.:
zrób sobie print-a tego co chesz wykonać
skopuj i uruchom normalnie, bo np. nie masz gdzieś znaku ' ograniczającego tekst

Dzięki za odpowiedź. Hmm nie bardzo rozumiem jak ma mi to pomóc. Sprawdzałem kilka możliwości ze znakiem ' i nic to nie dało. Jeśli możesz to napisz co dokładnie miałeś na myśli z tym printem.

konto usunięte

Temat: Dynamiczny SQL - klauzula Execute Immediate.

Paweł I.:
Przemysław R.:
zrób sobie print-a tego co chesz wykonać
skopuj i uruchom normalnie, bo np. nie masz gdzieś znaku ' ograniczającego tekst

Dzięki za odpowiedź. Hmm nie bardzo rozumiem jak ma mi to pomóc. Sprawdzałem kilka możliwości ze znakiem ' i nic to nie dało. Jeśli możesz to napisz co dokładnie miałeś na myśli z tym printem.

zamiast execute zrób jakiś http://docs.oracle.com/cd/B19306_01/appdev.102/b14258/...
Łukasz Schabek

Łukasz Schabek Architekt Rozwiązań

Temat: Dynamiczny SQL - klauzula Execute Immediate.

Paweł I.:
Witajcie, mam problem z klauzulą execute immediate.

Pokaż skrypt który uruchamiasz i dokładny komunikat błędu wraz z kodem ORA.
Paweł Iwiński

Paweł Iwiński Student,
Politechnika
Rzeszowska im.
Ignacego
Łukasiewicza

Temat: Dynamiczny SQL - klauzula Execute Immediate.

Łukasz S.:
Pokaż skrypt który uruchamiasz i dokładny komunikat błędu wraz z kodem ORA.

OK. Skrypty sprawdzam w SQL Developerze na bazie Oracle 11g XE schema - SOE.
Chce wykonać następujące skrypty:

1. EXECUTE IMMEDIATE 'SELECT o.order_id, c.customer_id FROM orders o JOIN customers c ON (o.customer_id = c.customer_id)';

Kod błędu z sql developer:

Error starting at line : 1 in command -
execute immediate 'SELECT o.order_id, c.customer_id FROM orders o JOIN customers c ON (o.customer_id = c.customer_id)'
Error report -
ORA-06550: line 1, column 17:
PLS-00103: Encountered the symbol "SELECT o.order_id, c.customer_id FROM orders o JOIN customers c " when expecting one of the following:

:= . ( @ % ;
The symbol ":=" was substituted for "SELECT o.order_id, c.customer_id FROM orders o JOIN customers c " to continue.
06550. 00000 - "line %s, column %s:\n%s"
*Cause: Usually a PL/SQL compilation error.
*Action:

Uwagi: bez klauzuli execute immediate to polecenie działa, ale wszystkie zapytania muszę wykonywać właśnie z tą klauzulą.

2. EXECUTE IMMEDIATE 'UPDATE orders SET ORDER_TOTAL = ORDER_TOTAL * 1.01 WHERE (ORDER_ID > 3670 AND ORDER_ID < 4000)';

Kod błędu z sql developer:
Error starting at line : 1 in command -
execute immediate 'UPDATE orders SET ORDER_TOTAL = ORDER_TOTAL * 1.01 WHERE (ORDER_ID > 3670 AND ORDER_ID < 4000)'
Error report -
ORA-06550: line 1, column 17:
PLS-00103: Encountered the symbol "UPDATE orders SET ORDER_TOTAL = ORDER_TOTAL * 1.01 WHERE (ORDER_" when expecting one of the following:

:= . ( @ % ;
The symbol ":=" was substituted for "UPDATE orders SET ORDER_TOTAL = ORDER_TOTAL * 1.01 WHERE (ORDER_" to continue.
06550. 00000 - "line %s, column %s:\n%s"
*Cause: Usually a PL/SQL compilation error.
*Action:


Uwagi: bez klauzuli execute immediate to polecenie działa.

3. Dla przykładu takie proste zapytanie z użyuciem execute immediate wykonuje się poprawnie:

EXECUTE IMMEDIATE 'SELECT * FROM Orders';Ten post został edytowany przez Autora dnia 27.05.14 o godzinie 12:26
Łukasz Schabek

Łukasz Schabek Architekt Rozwiązań

Temat: Dynamiczny SQL - klauzula Execute Immediate.

Spróbuj tak:


BEGIN
EXECUTE IMMEDIATE ' SELECT o.order_id, c.customer_id FROM orders o JOIN customers c ON (o.customer_id = c.customer_id)';
END;

http://psoug.org/definition/EXECUTE_IMMEDIATE.htmTen post został edytowany przez Autora dnia 27.05.14 o godzinie 12:34
Paweł Iwiński

Paweł Iwiński Student,
Politechnika
Rzeszowska im.
Ignacego
Łukasiewicza

Temat: Dynamiczny SQL - klauzula Execute Immediate.

Działa! Dzięki wielkie Łukasz. Tylko teraz np, w przypadku zapytania:

BEGIN
EXECUTE IMMEDIATE ' SELECT o.order_id, c.customer_id FROM orders o JOIN customers c ON (o.customer_id = c.customer_id)';
END;

SQL Developer zwraca komunikat: "anonymous block completed" a wyników tego selecta (tabel) nie wyświetlił.Ten post został edytowany przez Autora dnia 27.05.14 o godzinie 19:13
Łukasz Schabek

Łukasz Schabek Architekt Rozwiązań

Temat: Dynamiczny SQL - klauzula Execute Immediate.

Zapytanie nie zwróciło danych, ponieważ zostało wykonane w "anonimowym bloku" o czym poinformował Cię SQL Developer :)

Na tym poziomie sprawy zwracania rezultatów na "konsolę" trochę się komplikują. Tu znajdziesz przykład jak przechwycić zwracane z EXECUTE IMMEDIATE wartości: http://www.dba-oracle.com/t_oracle_execute_immediate.htm.

Zachęcam Cię również do zapoznania się z przewodnikiem po PL/SQLu, który znajdziesz na blogu naszego forumowicza Andrzeja Klusiewicza: http://andrzejklusiewicz.blogspot.com/2010/11/kurs-ora...
Paweł Grzegorz Kwiatkowski

Paweł Grzegorz Kwiatkowski Architekt
oprogramowania,
Ericsson

Temat: Dynamiczny SQL - klauzula Execute Immediate.

Paweł I.:
Witajcie, mam problem z klauzulą execute immediate. Otóż muszę wykonać kilka skryptów SQL poprzedzając je tą właśnie klauzlą.

Dlaczego musisz poprzedzić tą klauzulą? Co chcesz osiągnąć przez wywołanie EXECUTE IMMEDIATE ?

Może potrzebujesz dynamicznego SQLa?
http://docs.oracle.com/cd/B28359_01/appdev.111/b28370/...
Paweł Iwiński

Paweł Iwiński Student,
Politechnika
Rzeszowska im.
Ignacego
Łukasiewicza

Temat: Dynamiczny SQL - klauzula Execute Immediate.

@Paweł Grzegorz Kwiatkowski tylko takie zapytania są poprawnie przetwarzane przez swingbench (program do badania obciążenia baz danych).

Następna dyskusja:

[oracle 10g] dynamiczny sql...




Wyślij zaproszenie do