Как выбрать строку, которую я изменил в Oracle SQL - PullRequest
0 голосов
/ 10 декабря 2018

Я хочу обновить строку, после которой я хочу получить всю строку в Oracle SQL.Таблица и соответствующий запрос, который я использую, показаны ниже.Я хочу не запрашивать БД дважды.Следовательно, я делаю выбор после обновления, но я сталкиваюсь с ошибкой, показанной после запроса.Есть идеи, как это исправить?

CREATE TABLE mytable (
    sid NUMBER NOT NULL,
    eid VARCHAR(18) NOT NULL,
    first TIMESTAMP,
    updated TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    created TIMESTAMP,
    status VARCHAR(30),
    tid VARCHAR(18),
    wid VARCHAR(18),
    CONSTRAINT mytable_pk PRIMARY KEY (sid, eid)
    ENABLE
);

BEGIN
UPDATE mytable SET wid=?, status=? WHERE sid=?;
SELECT * FROM mytable WHERE sid=?;
END;

ОШИБКА:

java.sql.SQLException
ORA-06550: line 3, column 7:
PLS-00428: an INTO clause is expected in this SELECT statement

Соответствующий фрагмент кода Java:

PreparedStatement statement = prepareStatement(sql);
int index = 0;
statement.setString(index++, newWid);
statement.setString(index++, newStatus);
statement.setInt(index++, sid);
statement.setInt(index++, sid);
ResultSet results = statement.executeQuery();
if (results.next()) {
    Record rec = new Record();
    fill(rec, results);
}
return record;

Ответы [ 2 ]

0 голосов
/ 10 декабря 2018

Вы можете использовать предложение returning into, как показано ниже:

SQL> set serveroutput on;
SQL> DECLARE
  v_sid      mytable.sid%type;
  v_eid      mytable.eid%type;
  v_first    mytable.first%type;
  v_updated  mytable.updated%type;    
  v_created  mytable.created%type;
  v_status   mytable.status%type;
  v_tid      mytable.tid%type;
  v_wid      mytable.wid%type;        
BEGIN
  UPDATE mytable 
     SET wid=v_wid, status=v_status
   WHERE sid = v_sid
   RETURNING sid, eid, first, updated,
             created, status, tid, wid 
        INTO v_sid, v_eid, v_first, v_updated,
             v_created, v_status, v_tid, v_wid;
   dbms_output.put_line(' sid :' ||v_sid);  
   dbms_output.put_line(' eid :' ||v_eid);  
   dbms_output.put_line(' first :' ||v_first);  
   dbms_output.put_line(' updated :' ||v_updated);      
   dbms_output.put_line(' created :' ||v_created);  
   dbms_output.put_line(' status :' ||v_status);  
   dbms_output.put_line(' tid :' ||v_tid);  
   dbms_output.put_line(' wid :' ||v_wid);    
END;
0 голосов
/ 10 декабря 2018

В анонимном PL / SQL-блоке вы можете модифицировать данные с использованием UDPATE, но для выбора данных вам нужно выделить их во что-то.Переменная с типом строки, соответствующим выбранным данным, явным или неявным курсором или чем-то в этом роде.Пример:

BEGIN
   UPDATE mytable SET wid=?, status=? WHERE sid=?;
   FOR R in (SELECT * FROM mytable WHERE sid=?) LOOP
       DMBS_OUTPUT.PUT_LINE(r.sid ||' ' || r.wid);
       ... do something here
   END LOOP;
END:
...