أوراكل متواليات:CURRVAL غير مسموح به هنا ؟
سؤال
التالية Oracle SQL البرمجية بإنشاء خطأ "ORA-02287:رقم تسلسل لا يسمح هنا":
INSERT INTO Customer (CustomerID,Name) VALUES (Customer_Seq.nextval,'AAA');
SELECT * FROM Customer where CustomerID=Customer_Seq.currval;
يحدث الخطأ في السطر الثاني (SELECT).أنا لا أفهم حقا مشكلة ، لأن هذا العمل:
INSERT INTO Customer (CustomerID,Name) VALUES (Customer_Seq.nextval,'AAA');
SELECT Customer_Seq.currval from dual;
المحلول
كنت قد نشرت بعض التعليمات البرمجية ، لذلك فإنه ليس من الواضح ما كنت تحاول تحقيق.إذا كنت تريد أن تعرف القيمة المعينة ، ويقول عابرة إلى بعض الإجراءات الأخرى يمكن أن تفعل شيئا مثل هذا:
SQL> var dno number
SQL> insert into dept (deptno, dname, loc)
2 values (deptno_seq.nextval, 'IT', 'LONDON')
3 returning deptno into :dno
4 /
1 row created.
SQL> select * from dept
2 where deptno = :dno
3 /
DEPTNO DNAME LOC
---------- -------------- -------------
55 IT LONDON
SQL>
تحرير
يمكننا استخدام عودته شرط للحصول على قيم أي عمود ، بما في ذلك تلك التي تم تحديدها مع القيم الافتراضية أو تؤدي التعليمات البرمجية.
نصائح أخرى
لا تقول ما نسخة من "أوراكل" الذي تستخدمه.هناك في الماضي القيود المفروضة على حيث تسلسل يمكن استخدامها في PL/SQL - في معظمها إن لم يكن كلها ذهبت في 11G.أيضا ، هناك قيود في SQL - انظر هذه القائمة.
في هذه الحالة قد تحتاج إلى كتابة:
SELECT Customer_Seq.currval INTO v_id FROM DUAL;
SELECT * FROM Customer where CustomerID=v_id;
(تحريرها بعد تعليقات).
هذا لا حقا والإجابة على سؤالك مباشرة ، ولكن ربما ما تريد القيام به لا يمكن حلها باستخدام إدراج عودة الحدوث ؟
DECLARE -- ... last_rowid rowid; -- ... BEGIN -- ... INSERT INTO Customer (CustomerID,Name) VALUES (Customer_Seq.nextval,'AAA') RETURNING rowid INTO last_rowid; SELECT * FROM Customer where rowid = last_rowid; -- ... END; /
لا يجوز لك استخدام تسلسل في جملة WHERE - أنها لا تبدو طبيعية في السياق الخاص بك, ولكن أوراكل لا تسمح الإشارة في المقارنة التعبير.
[عدل]
وهذا من شأنه أن يكون PL/SQL تنفيذ:
declare
v_custID number;
cursor custCur is
select customerid, name from customer
where customerid = v_custID;
begin
select customer_seq.nextval into v_custID from dual;
insert into customer (customerid, name) values (v_custID, 'AAA');
commit;
for custRow in custCur loop
dbms_output.put_line(custRow.customerID||' '|| custRow.name);
end loop;
end;
عدم إنشاء أي
sequence
أولا إنشاء أي تسلسل دورة ذاكرة التخزين المؤقت.هذه هي بعض الأساسية سبيل المثال
Create Sequence seqtest1
Start With 0 -- This Is Hirarchy Starts With 0
Increment by 1 --Increments by 1
Minvalue 0 --With Minimum value 0
Maxvalue 5 --Maximum Value 5. So The Cycle Of Creation Is Between 0-5
Nocycle -- No Cycle Means After 0-5 the Insertion Stopes
Nocache --The cache Option Specifies How Many Sequence Values Will Be Stored In Memory For Faster Access
لا يمكنك أن تفعل فيها شرط على التسلسل في SQL نتيجة لا يمكن تصفية تسلسل .استخدام إجراءات مثل @APC قال