Не удается найти данные после фиксации в процедуре PL / SQL? - PullRequest
2 голосов
/ 07 декабря 2009

В моей процедуре PL / SQL есть фрагмент кода, который выполняет следующие действия:

INSERT INTO payment_operations (id, subscriber, amount, description) VALUES (payment_id, 1234, 5, 'Test');
COMMIT;

SELECT subscriber INTO test_subscriber FROM payment_operations_view WHERE id = payment_id;

После этого я получаю исключение "no_data_found"! Однако, если я сам выполнил ту же инструкцию SELECT после выполнения процедуры, я вижу запись.

Обратите внимание, что я выбираю из представления, а не непосредственно из таблицы. Почему я не вижу эти данные сразу после вставки?

Ответы [ 4 ]

7 голосов
/ 08 декабря 2009

Это догадка:

Есть ли в таблице payment_options столбец payment_id?

Я спрашиваю, потому что в следующем утверждении, в PL / SQL, если payment_id существует как столбец, тогда будет использоваться столбец, а не локальная переменная PL / SQL:

SELECT subscriber 
INTO test_subscriber 
FROM payment_operations_view 
WHERE id = payment_id;

Поскольку он использует столбец payment_id, если он существует, и поскольку он не был установлен во вставке, вы можете выполнять where id = null, который никогда не оценивается как true.

Я использую v_ для обозначения переменных. Таким образом, ваш фрагмент будет (с остальной частью процедуры, измененной соответственно):

INSERT INTO payment_operations (id, subscriber, amount, description) 
VALUES (v_payment_id, 1234, 5, 'Test');    
COMMIT; 

SELECT subscriber 
INTO v_test_subscriber 
FROM payment_operations_view WHERE id = v_payment_id;  
0 голосов
/ 08 декабря 2009

Вы вставляете в базовую таблицу, затем выбираете из вида. Есть ли у представления какие-либо условия фильтра? Если это так, возможно, что введенные вами данные просто не соответствуют условиям представления.

Как отмечали другие, также возможно, что представление является материализованным представлением, и в этом случае может потребоваться его обновление.

Я должен спросить ... почему логика требует выбора данных, которые вы только что вставили? Если вы не ожидаете, что что-то еще изменило данные между INSERT и SELECT, почему бы просто не использовать только что введенное вами значение subscriber вместо того, чтобы запрашивать его снова?

0 голосов
/ 08 декабря 2009

Похоже, что представление, на которое вы ссылаетесь, является «материализованным» представлением. Если да, попробуйте этот фрагмент кода, чтобы обновить представление вручную перед извлечением данных:

...
    INSERT INTO payment_operations (id, subscriber, amount, description) VALUES (payment_id, 1234, 5, 'Test');

    COMMIT;

    DBMS_SNAPSHOT.REFRESH( 'payment_operations_view','c');
    SELECT subscriber INTO test_subscriber FROM payment_operations_view WHERE id = payment_id;

    DBMS_OUTPUT.PUT_LINE('--> ' || test_subscriber);

...

Надеюсь, это поможет.

0 голосов
/ 07 декабря 2009

Явно поместите коммит после оператора вставки и проверьте.

Мне кажется, что оператор select выполняется до того, как на самом деле происходит коммит после вставки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...