Jak wykryć cudzysłów w nazwie argumentu procedury?

Odpowiedz Nowy wątek
2018-11-21 12:13
Chory Rycerz
0

Cześć, w jaki sposob obsluzyc przypadek z bledem ktory pojawia sie gdy wywolamy procedure w nastepujacy sposob:

test(aaa);

gdy wywolujemy:
test('aaa');
jest wszystko ok
Ponizej kod procedury.
Probowalem wykryc cudzyslow, ale chyba nie da sie tego zrobic..

PROCEDURE test(idnum IN VARCHAR2) 
    AS  
    cx integer;
    q_stmt2 varchar(1000);
BEGIN
  q_stmt2 := 'select INSTR(:1,ascii('''')) from dual'; 
  EXECUTE IMMEDIATE q_stmt2 
  INTO cx 
  USING idnum; 

  if cx >0 then
    DBMS_OUTPUT.PUT_LINE('Zawiera Blad wproawdzania danych!1');
  else
    DBMS_OUTPUT.PUT_LINE('Nie zawiera Blad wproawdzania danych!2');
  end if;

  EXCEPTION
  WHEN OTHERS THEN
    DBMS_OUTPUT.PUT_LINE('Exception: SQLCODE=' || SQLCODE || '  SQLERRM=' || SQLERRM);
  RAISE;

END; 

Pozostało 580 znaków

2018-11-21 14:03
0

nie rozumiem o co chodzi. Jeśli parametr jest typu varchar to należy przekazać ciąg znaków, czyli np. 'test' a nie test - samo test jest traktowane jak nazwa zmiennej, kolumny, tabeli a nie ciąg znaków. Cudzysłów w przekazywanym ciągu miałbyś wtedy jeśli przekazał byś coś takiego 'te''st' wtedy parametr :1 będzie miał wartość te'st


Chcesz pomocy - pokaż kod - abrakadabra źle działa z techniką.

Pozostało 580 znaków

2018-11-22 10:36
Chory Rycerz
0

chce obsluzyc przypadek gdzie zalozmy ktos bedzie musial wprowadzic argument a zamiast stringa / varchar poda tekst bez cudzyslowia, pytanie jak?

Pozostało 580 znaków

2018-11-22 11:06
0

gdzie będzie wprowadzał? Ja naprawdę nic nie rozumiem co chcesz zrobić


Chcesz pomocy - pokaż kod - abrakadabra źle działa z techniką.

Pozostało 580 znaków

2018-11-22 11:38
1

Jeżeli dobrze rozumiem to chcesz obsłużyć błąd który rzuca baza w przypadku nieprawidłowego przekazania argumentu:

--dobrze
test('aaa')

--źle, przypadek do wykrycia
test(aaa)

to w samej procedurze nie da się tego zrobić, bo w przypadku błędnej składni procedura się nie uruchomi, więc nie ma co sprawdzać, zresztą to jest przesada, takie bledy powinna łapac aplikacja.

Pozostało 580 znaków

2018-11-22 14:57
Chory Rycerz
0

Ok dzieki, czegos na tej zasadzie oczekiwałem.

ale podsumowując jeszcze raz napisze, wywolujac program w nastepujacy sposob:

exec test(aaa); 

dostaje blad:

Błąd:

exec test(aaa)
Error report -
ORA-06550: linia 1, kolumna 25:
PLS-00201: identyfikator 'AAA' powinien być zadeklarowany
ORA-06550: linia 1, kolumna 7:
PL/SQL: Statement ignored

  1. 00000 - "line %s, column %s:\n%s"
    Cause: Usually a PL/SQL compilation error.
    Action:

Kwestia tego jak to obsluzyc, jesli z poziomu procedury sie nie da to koniec tematu.

Pozostało 580 znaków

2018-11-22 15:08
0

Nie jestem specjalistą od Oracle ale posiłkując się tym: https://docs.oracle.com/cd/B1[...]appdev.920/a96624/07_errs.htm
to chyba w tym kierunku można pójść:

BEGIN
    exec test(aaa)
EXCEPTION
    WHEN OTHERS THEN           -- optional handler
      DBMS_OUTPUT.PUT_LINE('Zawiera Blad wproawdzania danych!1');
END;

Z poziomu procedury się nie da bo nie jest wywolywana

edytowany 1x, ostatnio: Panczo, 2018-11-22 15:09
no ale to to też opakujesz w procedurę a w nią wsadzisz kolejne łapanie wyjątku? Wg mnie to co chce uzyskać pytacz jest nielogiczne - jeśli dajesz komuś dostęp do SQLa to licz się z tym, że może zrobić coś głupiego - abrakadaber 2018-11-22 23:12
Nie znam się na Oracle, założyłem że to działa podobnie do try...catch z tsql i nie trzeba pakować tego w procedurę. Jak pisałem wyżej też nie widzę sensu w sprawdzaniu tego w ten sposób. - Panczo 2018-11-22 23:16
no tak, ale skoro to EXEC test(aaa) wpisuje user gdzieś to aby obsłużyć wyjątek to pozostały kod też by musiał user wpisać a to jest głupie. Dla jasności nie czepiam się Twojego rozwiązania (w zasadzie jedynego sensownego) tylko samego założenia pytacza - abrakadaber 2018-11-22 23:18
Ja założyłem że on to opakuwje w te bloki w apce i wysyła do bazy. Nawet nie wpadłbym na to by błędy składniowe łapać na poziome sqla. Pomijam dynamicznie generowane zapytania. - Panczo 2018-11-22 23:21
drugi post jak i całe pytanie temu przeczy - no bo jak to jest opakowane czymkolwiek to nie powinno być takiej opcji aby tym parametrem nie był string - abrakadaber 2018-11-22 23:24

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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