2011-06-30 10 views
5

Wystąpił konkretny problem z naszą definicją tabeli Oracle (DDL) i jednym z naszych skryptów PL/SQL.Jak zminimalizować sprzężenie/zależność między fizycznymi zmianami DDL a zmianami PL/SQL?

Problem jest, nastąpiła zmiana w tabeli zmienia się od varchar(20) do varchar(30) Zmiana ta jednak nie była pilnie odzwierciedlenie w jednym z naszych PL skryptów/SQL użytkujących dane, co było jeszcze varchar(20), powodując błąd ORA-06502: PL/SQL: numeric or value error podczas jednego z naszych testów regresji.

Chciałbym zasięgnąć porady od Oracle i ekspertów od bazy danych tutaj, czy napotkałeś takie scenariusze w przeszłości, w których nastąpiły zmiany w tabeli DDL i nie znalazły odzwierciedlenia w PL/SQL i jak sobie z tym poradzić luka.

Wiem, że jednym prostym sposobem byłaby jakaś forma egzekucji lub papierkowej roboty, ale czy zdarzyłoby się być piękniejszym lub eleganckim rozwiązaniem, tj. Sposobem, w jaki działają klucze obce, aby uniknąć anomalii wstawiania/aktualizacji/usuwania?

Dzięki!

Odpowiedz

6

Na początek zawsze należy zadeklarować zmienne jako typy w oparciu o definicje kolumn w tabelach:

czyli zamiast:

dept_name VARCHAR2(50); 

użytku:

dept_name dept.dept_name%TYPE; 

Że sposób, kiedy twoja tabela podstawowa się zmienia, twoja deklaracja jest nadal ważna.

Można również zadeklarować parametry procesowe jako typy, a także:

PROCEDURE proc(p1 IN dept.dept_name%TYPE) 
+0

+1 Cookie, jest geniuszem, przynajmniej dla mnie. –

+1

+1 Generalnie to działa dobrze. Nadal musisz zachować ostrożność, jeśli istnieje oczekiwanie na ograniczenie wielkości. Jednym z przykładów może być adres, który ma być wydrukowany na kopercie, w przypadku której nie pasuje do powiększonej kolumny bazy danych. –

+0

@Chin Boon, to z pewnością było coś, co zespół projektantów PL/SQL otrzymał! – DCookie