ورود

View Full Version : سوال: چگونه مي توان يك ركورد باشمارش اتوماتيك ساخت



hoseint
چهارشنبه 22 آبان 1387, 11:40 صبح
در اوراكل چگونه مي توان يك ركورد كه مثلا شماره سند هست را طوري تنظيم كرد كه هر بار كه يك سند جديد مي خواهيم ثبت كنيم يك شماره به بيشترين شماره آن ركورد در جدول مورد نظر اضافه كرد

abbasegold
پنج شنبه 23 آبان 1387, 22:28 عصر
شما میتوانی این کار را با استفاده از یک Sequence و یک Trigger انجام دهی

کافیست Trigger قبل از هر insert آخرین مقدار Sequence را فراخوانی کند.

موفق باشی ...

s_ahmadneya
جمعه 01 آذر 1387, 18:24 عصر
1-ابتدا یک Sequence تعریف می کنی
2- در هنگام صادر کردن دستور insert بجای مقدار فیلد نام seguence را می نویسی .
تذکر:برای هر فیلد اتونامبر باید یک Sequence بسازی موفق باشید
مثلا : اگر جدول دو فیلدid , name داشته باشد و یک Sequence بنام s_id تولید کرده باشیم برای ریختن مقدار دستور زیر صادر می شود.


insert ( id,name) values (s_id.nextval,'اسماعیل احمدنیا'(

abbasegold
پنج شنبه 07 آذر 1387, 18:17 عصر
بهتر است که Sequence را بوسیله Trigger فراخوانی کنی ...
و در دستور Insert نیاز به ذکر فیلد مورد نظر نیست.

s_ahmadneya
شنبه 09 آذر 1387, 19:00 عصر
بهتر است که Sequence را بوسیله Trigger فراخوانی کنی ...
و در دستور Insert نیاز به ذکر فیلد مورد نظر نیست.
]چطوری باید این کار رو بکنم من فقط از روش بالا استفاده می کنم

kiosksoft
شنبه 16 آذر 1387, 15:46 عصر
]چطوری باید این کار رو بکنم من فقط از روش بالا استفاده می کنم

سلام

برای استفاده از امکان AutoNumber در اوراکل از SEQUENCE میتونید استفاده کنید (به روش ذیل)

ایجاد SEQUENCE :


CREATE SEQUENCE sq

ایجاد جدول :


CREATE TABLE t_test( id INTEGER PRIMARY KEY, name VARCHAR(10) )

عمل درج :


INSERT INTO t_test(id,name) VALUES (sq.nextval,'value')

s_ahmadneya
یک شنبه 17 آذر 1387, 12:52 عصر
سلام

برای استفاده از امکان AutoNumber در اوراکل از SEQUENCE میتونید استفاده کنید (به روش ذیل)

ایجاد SEQUENCE :


CREATE SEQUENCE sq

ایجاد جدول :


CREATE TABLE t_test( id INTEGER PRIMARY KEY, name VARCHAR(10) )

عمل درج :


INSERT INTO t_test(id,name) VALUES (sq.nextval,'value')

دوست عزیر با تشکر از اینکه وقت گذاشتید من منظورم روش trigger بود .این روش قبلا" کدش را نوشته شده بود البته با یک غلط املایی اگه روش دیگری وجود دارد راهنمایی نماید ممنون می شم

Saeed_m_Farid
یک شنبه 17 آذر 1387, 13:58 عصر
اگه منظورت اینه که فقط تریگر میخوای رو جدول ببندی و سکوئنس نمیخوای میتونی اینو امتحان کنه

CREATE OR REPLACE TRIGGER "TRG_MY_UNIQUEUE_ID" BEFORE
INSERT ON "MY_TABLE" FOR EACH ROW DECLARE
LAST_MY_ID NUMBER;
REQUEST NUMBER;
BEGIN
SELECT MAX(MY_ID) INTO LAST_MY_ID
FROM MY_TABLE;
:NEW.MY_ID := LAST_MY_ID+1;
END;

kiosksoft
یک شنبه 17 آذر 1387, 14:06 عصر
دوست عزیز پیشنهاد من روش بالاست اما روشهای دیگه ای هم وجود دارد مثلا :



CREATE OR REPLACE TRIGGER <<Trigger_Name>>
BEFORE INSERT ON <<Table_Name>>
FOR EACH ROW
BEGIN
SELECT <<Seq_name>>.Nextval
INTO :new.<<col_name>>
FROM DUAL;
END;


یا


create trigger ti_orders on orders
for insert
as
declare @actionid int

select @actionid = coalesce( max(actionid)+ 1,0) from audit_orders
insert into audit_orders(actionid, orderid, action, who, actiontime)



یا



declare @myidentity intinsert into orders(CustomerID, EmployeeID, OrderDate) values ('ALFKI',1,getdate())select @myidentity = @@identityinsert into [order details] (OrderID, ProductID, UnitPrice, Quantity, Discount) values (@myidentity, 1, 5, 20, .05)

Developer Programmer
سه شنبه 10 دی 1387, 22:12 عصر
ممکنه تفاوت های، تریگر معمولی با تریگری توش for each row نوشته میشه رو واضح توضیح بدید؟


SELECT <<Seq_name>>.Nextval
INTO :new.<<col_name>>
FROM DUAL;
در برنامه نویسی تحت شبکه، اینکار باعث نمیشه که از یک شماره، دو کاربر استفاده کنن؟

منظورتون از
:new.<<col_name>> همان select col from inserted در sql server است؟

mexdixabibi
سه شنبه 01 اردیبهشت 1388, 02:15 صبح
create or replace trigger BIF_UPDATE
before update on tex_obslojevani
for each row
declare

--///////////////////////////////////////

A NUMBER;

B NUMBER;

L NUMBER;

M NUMBER := 0;

V_MAXIM tex_absloj.id_key%TYPE;

--*******************************

CURSOR ID_INSERT IS

SELECT MAX(ID_KEY) FROM tex_absloj;

pragma autonomous_transaction;
begin



--******************************************

A := :NEW.kilometr-:OLD.kilometr;

B:= FLOOR(A/:OLD.raite_tex_obc);
IF :NEW.kilometr > :OLD.next_tex_in

THEN

--************************************************** ************

FOR I IN 1..B
LOOP

--**********************************

OPEN ID_INSERT;
FETCH ID_INSERT INTO V_MAXIM;
IF V_MAXIM IS NULL
THEN

V_MAXIM:= 0;
ELSE
V_MAXIM := V_MAXIM;
END IF;
close ID_INSERT;

--********************************

M := M+:OLD.raite_tex_obc;

insert into tex_absloj
(id_car, kilometr, eache_change, to_chang,id_key)

values

(:NEW.id_car,:OLD.kilometr+M,:OLD.raite_tex_obc,:O LD.next_tex_in+M,V_MAXIM+1);

END LOOP;

--************************************************** ***********


L := :NEW.kilometr-((B*:OLD.raite_tex_obc)+:OLD.kilometr);


:NEW.octatak := L;


:NEW.next_tex_in := (:NEW.kilometr-L)+:OLD.raite_tex_obc;



END IF;

IF

:NEW.kilometr = :OLD.next_tex_in

THEN


insert into tex_absloj
(id_car, kilometr, eache_change, to_chang)

values

(:NEW.id_car,:NEW.kilometr,:OLD.raite_tex_obc,:OLD .next_tex_in+:OLD.raite_tex_obc);


:NEW.next_tex_in := :NEW.next_tex_in+:OLD.raite_tex_obc;

END IF;








COMMIT;
end BIF_UPDATE;

<l@ve_f@re>
دوشنبه 14 اردیبهشت 1388, 10:40 صبح
با سلام
به نظر بنده استفاده از Sequence بهتر از Trigger است چون شما می توانید مقدار شروع و مقدار جاری و بعدی و ماکزیمم آنرا تعریف کنید و به آنها دسترسی داشته باشید و یا احیاناً آنها را تغییر دهید. حتی می توانید برای Sequence خود Synonim تعریف نمایید و به کاربران دیگر اجازه دسترسی به آنرا بدهید و یا ندهید.