【问题标题】:Simple oracle insert简单的甲骨文插入
【发布时间】:2011-05-06 20:43:52
【问题描述】:

我正在尝试使用 Forms 将一些信息简单地插入到 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;

【问题讨论】:

  • 失败时会出现什么异常?
  • “不起作用”是什么意思 - 它只是没有插入您期望的内容,还是出现错误?您可以单独运行它并调试您尝试插入的值(例如dbms_output 语句)吗?
  • 你应该考虑使用 SEQUENCEs 用于 ano & lgn

标签: oracle oracle10g oracleforms


【解决方案1】:

扩展@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 表时使用它。

分享和享受。

【讨论】:

  • 那么我会把这些东西放在我的代码的什么地方?抱歉,我是 Oracle 的新手,我的老师帮不上什么忙。
  • 详细来说,这是一个由 WHEN-BUTTON-PRESSED 触发器调用的过程
  • 触发器和序列是与您的代码分开存在于数据库中的对象。他们只是坐在“数据库中”等待使用。要创建它们,您将使用 SQL*Plus(Oracle 用于执行 SQL 的命令行工具)之类的东西。或者您可以使用其中一种 GUI 工具,例如 PL/SQL Developer、Toad 或 Oracle 的 SQL Developer。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-07
  • 1970-01-01
相关资源
最近更新 更多