ওরাকল-এ আমি কীভাবে একটি সিক্যুয়েন্সটি সংরক্ষণ করতে পারি? একাধিক সন্নিবেশগুলিতে পুনরায় ব্যবহার করার জন্য একটি ভেরিয়েবলের পূর্ববর্তী অংশ?


13

আমি পরীক্ষার জন্য ডেটা সহ কিছু সারণী তৈরি করতে একটি স্ক্রিপ্ট লিখছি।

আমি নীচের মতো কিছু লিখতে চাই তবে এটি কীভাবে করতে হয় তা আমি জানি না (আমি ওরাকল ১১ জি)

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

এটি ভেরিয়েবল ঘোষণার দিকে নির্দেশ করে।

আমি কোনও ফাইল থেকে স্ক্রিপ্টটি লোড করতে জাভা ব্যবহার করছি এবং ওরাকল 11 জি সার্ভারে ওরেकल জেডিবিসি ড্রাইভার (ojdbc14-10.2.0.4.0.jar) ব্যবহার করে এটি চালাচ্ছি।

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

আপনি যদি ভেরিয়েবলগুলি ঘোষণা করে থাকেন তবে আপনার একটি ব্লকের প্রয়োজন হবে

11 গ্রাম দিয়ে, সিকোয়েন্সগুলির জন্য সমর্থন উন্নত করা হয়েছে যাতে আপনি এগুলি ব্যবহার করতে পারেন:

ENABLED_USER_ID := SEQ.NEXTVAL;

একটি selectবিবৃতি ব্যবহার না করে (যদিও উভয়ই কাজ করবে)

মানগুলি বজায় রাখার জন্য অন্যান্য বিকল্পগুলির মধ্যে সেগুলি একটি টেবিলে সংরক্ষণ করা বা একটি প্রসঙ্গ তৈরি করা অন্তর্ভুক্ত রয়েছে তবে আমি মনে করি sequence.currvalএখানে সত্যই সঠিক উত্তর আছে is


7
SELECT seq.nextval 
   INTO ENABLED_USER_ID
FROM dual;

ENABLED_USER_ID এর ডিক্লেয়ার ব্লকে ডানদিকে যেতে হবে?
বাসিলিকোড

@ ল্যান: হ্যাঁ, ভেরিয়েবলগুলি কেবলমাত্র একটি ডেকলারে বিভাগে সংজ্ঞায়িত করা যেতে পারে যা কেবল আপনার পিএল / এসকিউএল ব্লক থাকলে বৈধ হয়
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.