Простая оракула - PullRequest
       12

Простая оракула

0 голосов
/ 08 ноября 2010

Я пытаюсь просто вставить некоторую информацию в таблицу в Oracle, используя формы. Иногда оператор вставки работает, иногда нет. Я просто недостаточно опытен с Oracle, чтобы понять, что не работает. Вот код:

PROCEDURE create_account IS
temp_name varchar2(30);
temp_street varchar2(30);
temp_zip number(5);
temp_phone varchar2(30);
temp_login passuse.login%type;
temp_pass varchar2(30);
temp_total number(4);
temp_lgn passuse.lgn%type;
cursor num_cursor is
    select MAX(ano)
    from accounts;
cursor lgn_cursor is
    select MAX(lgn)
    from passuse;
BEGIN
temp_name:= Get_Item_Property('ACCOUNTS.A_NAME', database_value);
temp_street:= Get_Item_Property('ACCOUNTS.STREET', database_value);
temp_zip:= Get_Item_Property('ACCOUNTS.ZIP', database_value);
temp_phone:= Get_Item_Property('ACCOUNTS.STREET', database_value);
temp_login:= Get_Item_Property('PASSUSE.LOGIN', database_value);
temp_pass:= Get_Item_Property('PASSUSE.PASS', database_value);

open num_cursor;
fetch num_cursor into temp_total;

open lgn_cursor;
fetch lgn_cursor into temp_lgn;


if(lgn_cursor%found) then
    if(num_cursor%found) then
                    temp_lgn := temp_lgn + 20;
                    --the trouble maker..
                    INSERT INTO passuse (lgn, a_type, login, pass)
                    VALUES (temp_lgn, 1, temp_login, temp_pass);
                    temp_total := temp_total+1;
                    INSERT INTO accounts(ano,lgn,a_name,street,zip,phone)
                    VALUES (temp_total,temp_lgn,temp_name,temp_street,temp_zip,temp_phone);
    end if;
end if;
close lgn_cursor;
close num_cursor;
commit;

END;

1 Ответ

1 голос
/ 09 ноября 2010

Чтобы расширить комментарий @ Mikpa - очевидно, что было бы неплохо получить значения для ACCOUNTS.ANO и PASSUSE.LGN из последовательностей. Заполнение этих полей автоматически с помощью триггера также будет полезно. Примерно так:

-- Note that the following is intended as a demo.  When executing these statements
-- you'll probably have to modify them for your particular circumstances.

SELECT MAX(ANO) INTO nMax_ano FROM ACCOUNTS;
SELECT MAX(LGN) INTO nMax_lgn FROM PASSUSE;

CREATE SEQUENCE ACCOUNTS_SEQ START WITH nMax_ano+1;
CREATE SEQUENCE PASSUSE_SEQ START WITH nMax_lgn+1;

CREATE TRIGGER ACCOUNTS_BI
  BEFORE INSERT ON ACCOUNTS
  FOR EACH ROW
BEGIN
  SELECT ACCOUNTS_SEQ.NEXTVAL
    INTO :NEW.ANO
    FROM DUAL;
END ACCOUNTS_BI;

CREATE TRIGGER PASSUSE_BI
  BEFORE INSERT ON PASSUSE
  FOR EACH ROW
BEGIN
  SELECT PASSUSE_SEQ.NEXTVAL
    INTO :NEW.LGN
    FROM DUAL;
END PASSUSE_BI;

Сделав вышесказанное, вы теперь можете записать свои вставки в эти таблицы как

INSERT INTO passuse (a_type, login, pass)           
  VALUES (1, temp_login, temp_pass)
RETURNING LGN INTO temp_lgn;

и

INSERT INTO accounts(lgn, a_name, street, zip, phone)           
  VALUES (temp_lgn, temp_name, temp_street, temp_zip, temp_phone); 

Обратите внимание, что в обоих операторах значения ключей (PASSUSE.LGN и ACCOUNTS.ANO) не указаны в списке полей, поскольку новые триггеры должны позаботиться о их правильном заполнении. Также обратите внимание, что при вставке в PASSUSE предложение RETURNING используется для возврата нового значения для LGN, чтобы его можно было использовать при вставке в таблицу ACCOUNTS.

Делись и наслаждайся.

...