it-swarm.asia

في أوراكل ، كيف أقوم بحفظ Sequence.nextval في متغير لإعادة استخدامه في إدخالات متعددة؟

أقوم بكتابة برنامج نصي لملء بعض الجداول بالبيانات للاختبار.

أود أن أكتب شيئًا مما يلي لكني لا أعرف كيفية القيام بذلك (أنا 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 المرجع ، لكنني أفضل حفظ المعرّف في متغيرات مسمى بشكل صحيح.

ربما ينبغي عليّ فقط التفاف النص في DECLARE ... BEGIN ... END; لكني آمل أن تكون هناك طريقة أكثر إيجازًا للقيام بذلك.


إضافة 27 مايو 2011 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)
);
13
basilikode

أعتقد أنها تسير على هذا النحو

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;
/
11
bernd_k

ستفعل ذلك باستخدام العبارة العائدة في عبارة INSERT الأولى.

حدث: حدث لكتابة هذا في مدونتي مؤخرًا.

10
Gaius

ستحتاج إلى كتلة إذا كنت تعلن المتغيرات

باستخدام 11g ، تم تحسين دعم التسلسلات حتى تتمكن من استخدامها مثل:

ENABLED_USER_ID := SEQ.NEXTVAL;

بدلاً من استخدام عبارة select (على الرغم من أن الاثنين سيعملان)

تتضمن الخيارات الأخرى لاستمرار القيم حفظها في جدول أو إنشاء سياق ، ولكن أعتقد sequence.currval هو حقا "الجواب الصحيح" هنا

8
Jack says try topanswers.xyz
SELECT seq.nextval 
   INTO ENABLED_USER_ID
FROM dual;
7
a_horse_with_no_name

أعتقد أنه يمكنك بالفعل الابتعاد بدون أي متغيرات إضافية باستخدام 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);
4
mustaccio