|
Подстановка в SELECT (маразм крепчает)
|
|||
---|---|---|---|
#18+
По совету некоторых гуру начал копать пакет DBMS_SQL, дабы насладиться его фичами под Oracle 8. Сделал небольшой пример с функциями DBMS_SQL.OPEN_CURSOR, DBMS_SQL.PARSE и пр. С первой попытки компилятор пнул меня с воплем, что "не гарантируется, что ваша функция не изменить БД". Начал копать, куда вставить строчку с прагмой PRAGMA RESTRICT_REFERENCES (< имячко>, WNDS). Пришлось создать свой пакет с егойным телом. Package Spec. выглядит так - PACKAGE svr_sql IS FUNCTION kill_sql(fk_id_in IN INTEGER, fk_table_in IN VARCHAR2, fk_id_col_in IN VARCHAR2, fk_nm_col_in IN VARCHAR2) return varchar2; PRAGMA RESTRICT_REFERENCES (kill_sql,WNDS); END; Вышеуказаный код спокойно принимается и сохраняется посредством SQL Navigator. А тело пакета выглядит как - PACKAGE BODY svr_sql IS FUNCTION KILL_SQL (fk_id_in IN INTEGER, fk_table_in IN VARCHAR2, fk_id_col_in IN VARCHAR2, fk_nm_col_in IN VARCHAR2) RETURN VARCHAR2 IS cur INTEGER := DBMS_SQL.OPEN_CURSOR; fdbk INTEGER; return_value VARCHAR2(100) := NULL; BEGIN DBMS_SQL.PARSE (cur, 'SELECT ' || fk_nm_col_in || ' FROM ' || fk_table_in || ' WHERE ' || fk_id_col_in || ' = :fk_value', DBMS_SQL.V7); DBMS_SQL.BIND_VARIABLE (cur, 'fk_value', fk_id_in); DBMS_SQL.DEFINE_COLUMN (cur, 1, fk_nm_col_in, 100); fdbk := DBMS_SQL.EXECUTE (cur); fdbk := DBMS_SQL.FETCH_ROWS (cur); IF fdbk > 0 THEN DBMS_SQL.COLUMN_VALUE (cur, 1, return_value); END IF; DBMS_SQL.CLOSE_CURSOR (cur); RETURN return_value; END; END; При попытке сохранить данное тело, SQL Navigator орет, что "PLS-00452: Подпрограмма KILL_SQL нарушает свою прагму". Никакие развлечения с прагмой (WNDS, WNPS...) толку не дают. Как победить гада ? ... |
|||
:
Нравится:
Не нравится:
|
|||
07.02.2002, 06:30 |
|
Подстановка в SELECT (маразм крепчает)
|
|||
---|---|---|---|
#18+
Дело в том, что если ты используешь пакет DBMS_SQL то прагма не нужна, т.е. ты говоришь что функция может делать что угодно. Но с такую функцию нельзя использовать в операторе select, поэтому DBMS_SQL скорее всего тебя не спасет. ... |
|||
:
Нравится:
Не нравится:
|
|||
07.02.2002, 06:58 |
|
Подстановка в SELECT (маразм крепчает)
|
|||
---|---|---|---|
#18+
>Дело в том, что если ты используешь пакет DBMS_SQL то прагма не нужна, т.е. >ты говоришь что функция может делать что угодно. >Но с такую функцию нельзя использовать в операторе select, >поэтому DBMS_SQL скорее всего тебя не спасет. Чего-то я не понял, откуда ноги растут. Во-первых, где это сказано, что при использовании DBMS_SQL в своих функциях прагма не нужна ? Во-вторых, когда пишется свой Package Body, еще не известно, где и как в будущем я собираюсь использовать функции своего пакета (в SELECTe, в INSERTe, с пивом или без . Так что, обьяснение не прокатывает. ... |
|||
:
Нравится:
Не нравится:
|
|||
07.02.2002, 07:08 |
|
Подстановка в SELECT (маразм крепчает)
|
|||
---|---|---|---|
#18+
Отсутствие прагмы означает, что данная функция может писать/читать в/из БД и пакет/а. И если ты посмотриж на то как описаны функции из DBMS_SQL (например parse), то поймешь, что прагма для функций, использующих DBMS_SQL не нужна, т.к. для них допустимо любое действие. Все это следует из правил наследования прагмы. В операторе select можно использовать только те функции которые не меняют состояния пакета и таблиц. ... |
|||
:
Нравится:
Не нравится:
|
|||
07.02.2002, 08:35 |
|
Подстановка в SELECT (маразм крепчает)
|
|||
---|---|---|---|
#18+
Сергей, функции с использованием DBMS_SQL доступны в DML-выражениях только в Oracle версий не ниже 8i. ... |
|||
:
Нравится:
Не нравится:
|
|||
07.02.2002, 14:00 |
|
Подстановка в SELECT (маразм крепчает)
|
|||
---|---|---|---|
#18+
PARGMA устанавливает уровень строгости, для его выполнения должно собдюдаться условие. Из любой функции/процедуры, с заданым уровнем строгости, не может быть вызвана функция/процедура с уровнем строгости ниже. У DBMS_SQL уровень строгости самый низкий. Последствия понятны ... |
|||
:
Нравится:
Не нравится:
|
|||
15.02.2002, 07:32 |
|
|
start [/forum/topic.php?fid=52&msg=32022369&tid=1993429]: |
0ms |
get settings: |
10ms |
get forum list: |
15ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
35ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
39ms |
get tp. blocked users: |
1ms |
others: | 17ms |
total: | 139ms |
0 / 0 |