带有变量的PL / SQL插入脚本无法正常工作

时间:2018-02-11 01:51:15

标签: sql oracle plsql

我是PL / SQL的新手,现在我正在处理我的插入脚本。他们正在处理变量,从select语句中获取。

我努力了!但我没有得到它的工作。每个固定错误都会带来另一个错但是我从在线示例中进行了比较和复制,它应该可以工作。

这是脚本:

/* Inserts */
VARIABLE v_nutzer_gustav NUMBER(5);
VARIABLE v_artikelid NUMBER(5);
VARIABLE v_gustavspaypal VARCHAR(80);
DECLARE
    v_nutzer_gustav nutzer.id%TYPE;
    v_artikelid artikel.id%TYPE;
    v_gustavspaypal zahlungsdaten.id%TYPE;
BEGIN
    INSERT INTO artikel (name, interpret, genre, erscheinungsjahr, typ, preis, bestand) VALUES ('Dark Side Of The Moon', 'Pink Floyd', 'Rock', 1978, 5, 9.99, 5);
    INSERT INTO nutzer (login, passwort, vorname, nachname) VALUES ('footballfan2010', 'geheim123', 'Peter', 'Pfennig');
    INSERT INTO nutzer (login, passwort, vorname, nachname) VALUES ('t.maier', 'agrar5$', 'Thorsten', 'Maier');
    INSERT INTO nutzer (login, passwort, vorname, nachname) VALUES ('KingGustav', 'gustav1997', 'Gustav', 'Gauner');
    SELECT id INTO v_nutzer_gustav FROM nutzer WHERE login = 'KingGustav';

    UPDATE nutzer SET stammkunde = 'Y' WHERE id = v_nutzer_gustav;
    /* Stammkunde tätigt Kauf */
    SELECT id INTO v_artikelid FROM artikel WHERE name = 'Dark Side Of The Moon' AND interpret = 'Pink Floyd';
    INSERT INTO bestellungen (nutzer_id, artikel_id) VALUES (:v_nutzer_gustav, :v_artikelid);
    INSERT INTO zahlungsdaten (nutzer_id, art, details) VALUES (:v_nutzer_gustav, 'PayPal', 'gustav@gmail.com');
    SELECT id INTO v_gustavspaypal FROM zahlungsdaten WHERE nutzer_id = :v_nutzer_gustav AND art = 'PayPal';
    INSERT INTO rechnungen (zahlungsdaten_id, betrag) VALUES (:v_gustavspaypal, GET_PRICE(:v_artikelid, :v_nutzer_gustav));
EXCEPTION
  WHEN no_data_found THEN
    dbms_output.put_line('No record avialable');
  WHEN too_many_rows THEN
   dbms_output.put_line('Too many rows');
END;
/

当我玩的时候:

Verwendung: VAR[IABLE] [ <variable> [ NUMBER | CHAR | CHAR (n [CHAR|BYTE]) |
    VARCHAR2 (n [CHAR|BYTE]) | NCHAR | NCHAR (n) |
    NVARCHAR2 (n) | CLOB | NCLOB | BLOB | BFILE
    REFCURSOR | BINARY_FLOAT | BINARY_DOUBLE ] ] 
Verwendung: VAR[IABLE] [ <variable> [ NUMBER | CHAR | CHAR (n [CHAR|BYTE]) |
    VARCHAR2 (n [CHAR|BYTE]) | NCHAR | NCHAR (n) |
    NVARCHAR2 (n) | CLOB | NCLOB | BLOB | BFILE
    REFCURSOR | BINARY_FLOAT | BINARY_DOUBLE ] ] 
Verwendung: VAR[IABLE] [ <variable> [ NUMBER | CHAR | CHAR (n [CHAR|BYTE]) |
    VARCHAR2 (n [CHAR|BYTE]) | NCHAR | NCHAR (n) |
    NVARCHAR2 (n) | CLOB | NCLOB | BLOB | BFILE
    REFCURSOR | BINARY_FLOAT | BINARY_DOUBLE ] ] 
SP2-0552: Bind-Variable "V_GUSTAVSPAYPAL" nicht deklariert.

必定会有很多错误,因为当我删除v_gustavspaypal行时,错误后仍然会出错。我相信SELECT INTOs中的变量得到NULL,它们不应该是。

有人可以纠正:(

2 个答案:

答案 0 :(得分:1)

目前尚不清楚为什么在这里需要绑定变量。您正在将值选择为等效的PL / SQL变量并在DML中使用它们。

正如错误信息中清楚显示的那样,

  • 您无法设置NUMBER绑定变量
  • 的大小
  • VARCHAR不支持作为绑定变量,您可以使用VARCHAR2代替(可选择使用大小)。

因此,如果您想使用这些变量,请将其更改为

VARIABLE v_nutzer_gustav NUMBER
VARIABLE v_artikelid NUMBER
VARIABLE v_gustavspaypal VARCHAR2(80)
你说,

  

必须有很多错误,因为当我删除v_gustavspaypal时   在错误之后我仍然会收到错误。

请发布错误消息或尝试弄清楚它们应该发生的原因。通常情况下,当您使用相应的错误进行简单的Google搜索时,只需快速找到所需的解决方案即可。

答案 1 :(得分:0)

你有三个主机变量与三个PL / SQL变量具有相同的名称,这是令人困惑的,似乎没有必要。有几个select into构造看起来好像只是捕获生成的键值,因此可以用returning into替换,这也将消除对异常处理程序的需要。

我认为你只需要这样的东西(未经测试,因为我没有你的桌子):

declare
    v_nutzer_gustav nutzer.id%type;
    v_artikelid artikel.id%type;
    v_gustavspaypal zahlungsdaten.id%type;
begin
    insert into artikel (name, interpret, genre, erscheinungsjahr, typ, preis, bestand) values ('Dark Side Of The Moon', 'Pink Floyd', 'Rock', 1978, 5, 9.99, 5)
    returning id into v_artikelid;

    insert into nutzer (login, passwort, vorname, nachname) values ('footballfan2010', 'geheim123', 'Peter', 'Pfennig');

    insert into nutzer (login, passwort, vorname, nachname) values ('t.maier', 'agrar5$', 'Thorsten', 'Maier');

    insert into nutzer (login, passwort, vorname, nachname) values ('KingGustav', 'gustav1997', 'Gustav', 'Gauner')
    returning id into v_nutzer_gustav;

    update nutzer set stammkunde = 'Y' where id = v_nutzer_gustav;

    /* stammkunde tätigt kauf */
    insert into bestellungen (nutzer_id, artikel_id) values (v_nutzer_gustav, v_artikelid);

    insert into zahlungsdaten (nutzer_id, art, details) values (v_nutzer_gustav, 'PayPal', 'gustav@gmail.com')
    returning id into v_gustavspaypal;

    insert into rechnungen (zahlungsdaten_id, betrag) values (v_gustavspaypal, get_price(v_artikelid, v_nutzer_gustav));
end;