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

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

0

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

0

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

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.

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
06550. 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.

0

Nie jestem specjalistą od Oracle ale posiłkując się tym: https://docs.oracle.com/cd/B10501_01/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

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