ใน Oracle ฉันจะบันทึกซีเควนซ์ต่อไปได้อย่างไรในตัวแปรที่จะใช้ซ้ำในส่วนแทรกหลาย ๆ


13

ฉันกำลังเขียนสคริปต์เพื่อเติมตารางด้วยข้อมูลสำหรับการทดสอบ

ฉันต้องการเขียนสิ่งต่อไปนี้ แต่ฉันไม่รู้วิธีการ (ฉัน Oracle 11g)

SET ENABLED_USER_ID = SEQ.NEXTVAL; // PSEUDOCODE
SET DISABLED_USER_ID = SEQ.NEXTVAL; // PSEUDOCODE

INSERT INTO USERS
        (ID,      USR_NAME)
VALUES  (:ENABLED_USER_ID, 'ANDREW');
INSERT INTO CAR
       (CAR_ID,         CAR_NAME, USR_ID)
VALUES (CARSEQ.NEXTVAL, 'FORD',   :ENABLED_USER_ID);

INSERT INTO USERS
        (ID,      USR_NAME)
VALUES  (:DISABLED_USER_ID, 'ANDREW');
INSERT INTO CAR
       (CAR_ID,         CAR_NAME, USR_ID)
VALUES (CARSEQ.NEXTVAL, 'FORD',   :DISABLED_USER_ID);

ฉันรู้ว่าฉันสามารถจัดเรียงคิวรีใหม่และใช้การsequence.currvalอ้างอิง แต่ฉันต้องการให้บันทึก ID ในตัวแปรที่ตั้งชื่ออย่างถูกต้อง

บางทีฉันควรห่อสคริปต์ด้วยDECLARE ... BEGIN ... END;แต่ฉันหวังว่าจะมีวิธีรัดกุมกว่าในการทำ


นอกจากนี้ 27 พฤษภาคม 2554 15:31 น

ดูเหมือนว่าในกรณีใด ๆ ฉันต้องประกาศตัวแปรในDECLAREบล็อก ดังนั้นฉันจึงพยายาม

DECLARE
  USER_ID NUMBER(10,0) := 1;
BEGIN   
  insert into TEST_USER
  values (user_id, 'andrew', sysdate);   
END;

แต่ฉันได้รับข้อผิดพลาดดังต่อไปนี้

Caused by: java.sql.SQLException: ORA-06550: **line 2, column 27:**
PLS-00103: Encountered the symbol "end-of-file" when expecting one of the following:

  * & = - + ; < / > at in is mod remainder not rem
  <an exponent (**)> <> or != or ~= >= <= <> and or like like2
  like4 likec between || multiset member submultiset

ชี้ไปที่การประกาศตัวแปร

ฉันใช้ java เพื่อโหลดสคริปต์จากไฟล์และเรียกใช้โดยใช้ไดรเวอร์ Oracle JDBC (ojdbc14-10.2.0.4.0.jar) บนเซิร์ฟเวอร์ Oracle 11g

สร้าง TEST_USER ตารางแล้ว

create table TEST_USERS (
    id number(10, 0) not null,
    name varchar2(100),
    date_ins date default sysdate,
    primary key (id)
);

คำตอบ:


11

ฉันคิดว่ามันเป็นเช่นนี้

DECLARE
    ENABLED_USER_ID PLS_INTEGER;
    DISABLED_USER_ID PLS_INTEGER;
BEGIN
    ENABLED_USER_ID := SEQ.NEXTVAL;
    DISABLED_USER_ID := SEQ.NEXTVAL;

    INSERT INTO USERS (ID, USR_NAME)
    VALUES  (ENABLED_USER_ID, 'ANDREW');

    INSERT INTO CAR (CAR_ID, CAR_NAME, USR_ID)
    VALUES (CARSEQ.NEXTVAL, 'FORD', ENABLED_USER_ID);

    INSERT INTO USERS (ID, USR_NAME)
    VALUES  (DISABLED_USER_ID, 'ANDREW');

    INSERT INTO CAR (CAR_ID, CAR_NAME, USR_ID)
    VALUES (CARSEQ.NEXTVAL, 'FORD', DISABLED_USER_ID);
END;
/


8

คุณจะต้องมีบล็อกถ้าคุณต้องการประกาศตัวแปร

ด้วย 11g การสนับสนุนลำดับได้รับการปรับปรุงเพื่อให้คุณสามารถใช้งานได้เช่น:

ENABLED_USER_ID := SEQ.NEXTVAL;

แทนที่จะใช้selectคำสั่ง (แม้ว่าทั้งสองจะทำงาน)

ตัวเลือกอื่นสำหรับการยืนยันค่ารวมถึงการบันทึกลงในตารางหรือสร้างบริบทแต่ฉันคิดว่าsequence.currvalเป็น 'คำตอบที่ถูกต้อง' จริงๆที่นี่


7
SELECT seq.nextval 
   INTO ENABLED_USER_ID
FROM dual;

ENABLED_USER_ID ควรอยู่ในบล็อคการประกาศใช่ไหม
basilikode

@Xan: ใช่ตัวแปรสามารถกำหนดได้ในส่วน DECLARE เท่านั้นซึ่งจะใช้ได้เฉพาะเมื่อคุณมีบล็อก PL / SQL
a_horse_with_no_name

4

ฉันคิดว่าคุณสามารถหนีไปได้โดยไม่ต้องใช้ตัวแปรเพิ่มเติมโดยใช้currval:

INSERT INTO USERS
    (ID,      USR_NAME)
VALUES  (SEQ.NEXTVAL, 'ANDREW');
INSERT INTO CAR
   (CAR_ID,         CAR_NAME, USR_ID)
VALUES (CARSEQ.NEXTVAL, 'FORD',   SEQ.CURRVAL);
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.