Xuddi shu stoldagi barcha ma'lumotlarni tanlagandan so'ng jadvaldagi barcha ma'lumotlarni o'chirib tashlash

Men xohlaganim, jadvaldagi barcha satrlarni tanlash va tanlangan va namoyish etilgandan so'ng, jadvalda joylashgan ma'lumotlar to'liq o'chirilishi kerak. Asosiy tashvish shundaki, bu faqat plsql emas, balki sql yordamida amalga oshirilishi kerak. Buni paket ichida qilishimiz mumkinmi va bu paketni tanlangan bayonotda chaqirishimiz mumkinmi? Marhamat, iltimos menga bu erda.

Dummy Table quyidagicha:

   ID   NAME   SALARY   DEPT
==================================
   1    Sam    50000     HR
   2    Max    45000     SALES
   3    Lex    51000     HR
   4    Nate   66000     DEV

Har qanday yordam katta minnatdor bo'ladi.

0
Ma'lumotni ko'rsatishga to'g'ri keladi va ma'lumotlar keyingi ma'lumotlarni o'chirish uchun keyingi ma'lumotlarni saqlash uchun kerak. Bu faqat sqlni ishlatish bilan cheklangan bo'lsa ham, oson va oson. Sorguyu qo'yish kerak bo'lgan vosita yoki (aytadigan) vosita faqat sql va boshqa hech narsa qabul qilmaydi; mytable-dan 1 = 1 bo'lgan joydan o'chirish; noto'g'ri identifikator "deb ataydigan xatoni chiqaradi"; " Ehtimol, bu kerakli natijalarga mos keladigan vositadir.
qo'shib qo'ydi muallif hashir, manba
ma'lumotni ko'rsatadi, lekin uni hech qachon o'chirmaydi. Aytgancha, yordam uchun tashakkur.
qo'shib qo'ydi muallif hashir, manba
Jadvaldan * tanlang; jadvaldan o'chirish 1 = 1; --O'rta - qisqartirilgan jadval;
qo'shib qo'ydi muallif Piotr Kamoda, manba
Eh, ikkita liner to'liq plsql sintaksisi emas, shuning uchun asbob cheklangan bo'lishi kerak. Ehtimol, ikkita alohida so'rov yuboring. Ammo bunday ikki satr so'rovi to'g'ri sql kodidir. Lekin boshqa narsalarni izlayotganingizni tushunaman.
qo'shib qo'ydi muallif Piotr Kamoda, manba
Siz qilyapsizmi? ^
qo'shib qo'ydi muallif Piotr Kamoda, manba

6 javoblar

Buni paket ichida bajarish mumkin emas, chunki "bu faqat plsql emas, balki sql yordamida amalga oshirilishi kerak". paketi PL/SQL.

Ammo juda oddiy. Siz ikkita narsani xohlaysiz: jadval ma'lumotlarini tanlang va uni o'chirib tashlang. Ikki narsa, ikkita buyruq.

select * from mytable;
truncate mytable;

( o'chirib qo'ying mytable; kodini delete mytable bilan o'zgartirishi mumkin, lekin bu sekinroq bo'ladi va uni o'chirishni tasdiqlash uchun commit; va bitimni tugatish.)

0
qo'shib qo'ydi
Ma'lumotni ko'rsatishga to'g'ri keladi va ma'lumotlar keyingi ma'lumotlarni o'chirish uchun keyingi ma'lumotlarni saqlash uchun kerak. Bu faqat sqlni ishlatish bilan cheklangan bo'lsa ham, oson va oson. Sorguyu qo'yish kerak bo'lgan vosita yoki (aytadigan) vosita faqat sql va boshqa hech narsa qabul qilmaydi; mytable-dan 1 = 1 bo'lgan joydan o'chirish; noto'g'ri identifikator "deb ataydigan xatoni chiqaradi"; " Ehtimol, bu kerakli natijalarga mos keladigan vositadir.
qo'shib qo'ydi muallif hashir, manba
bu muammoni hal qilmaydi, bir vaqtning o'zida ko'rinmaydi va o'chirilmaydi.
qo'shib qo'ydi muallif hashir, manba
Xo'sh, nima muammo hisoblanadi? Dasturni tasavvur qilaman: 1. ma'lumotlarni tanlaydi; 2. ma'lumotlar o'chiriladi; 3. Agar hamma yaxshi harakatlansa, u ma'lumotlarni ko'rsatadi. Bunday yondashuv bilan nima yomon bo'lishi mumkin edi? Nega bu etarli emas?
qo'shib qo'ydi muallif Thorsten Kettner, manba

Siz qidirayotgan xususiyat: SERIALIZABLE ISOLATION LEVEL . Bu xususiyat ayniqsa SELECT va DELETE kodlarini o'qish va ishlashni kafolatlaydigan takroriy o'qishlar ni taqdim etadi. bir xil ma'lumotlar.

Misol

Alter session set isolation_level=serializable;

select * from tempdate;  

--- now insert from other session a new record

delete from  tempdate ; 
commit;

-- re-query the table old records are deleted, new recor preserved.
0
qo'shib qo'ydi
Bergan yechimingiz muammoni hal qilish uchun bir oz ahamiyatga ega, ammo aniq emas, hali ko'p rahmat. @Kamil mening muammomni oladi, lekin men foydalanadigan vositani cheklash sababli mumkin bo'lgan echim yo'q deb o'ylayman. Sizning harakatlaringiz uchun rahmat.
qo'shib qo'ydi muallif hashir, manba
@Kamil uzoq vaqt davomida raqam yoki tanlangan yozuv rekvizitga kiritilgan raqamga teng bo'lishi kerak. Bu echim kafolatlanadi, boshqa yondashuvlar oqish qaydlarini yozish mumkin, ya'ni hech qachon tanlanmagan yozuvni qo'shishingiz mumkin.
qo'shib qo'ydi muallif Marmite Bomber, manba
Keyin, "paket ichkarisida va bu paketni tanlab olingan bayonotda chaqirganda" degani nimani anglatadi?
qo'shib qo'ydi muallif Kamil Ibadov, manba
Funktsiyada biz yangi satr qo'shishni to'xtata olamiz, men sizning yechimingiz boshqa savol uchun javob deb o'ylayman.
qo'shib qo'ydi muallif Kamil Ibadov, manba
tanlash so'rovi tugaganda, bitta so'rov bilan yozuvni o'chirishni xohlaydi
qo'shib qo'ydi muallif Kamil Ibadov, manba

SQL so'rovidan ma'lumotlarni tanlash uchun pipelined funksiyasidan foydalaning.

Funktsiya kerakli ma'lumot uchun kursorni belgilashingiz mumkin (yoki jadvaldagi barcha ma'lumotlar), kursorning har bir satrini boradigan joyida aylantirish orqali ko'chadan o'tkazish.

Kursor aylanishi tugashi bilan, ya'ni barcha ma'lumotlar so'rovingiz tomonidan iste'mol qilingan bo'lsa, funktsiya TRUNCATE jadvalini bajarishi mumkin.

Funktsiyani tanlash uchun quyidagi sintaksisdan foydalaning;

SELECT * 
FROM   TABLE(my_function)

See the following Oracle documentation for information pipelined functions - https://docs.oracle.com/cd/B28359_01/appdev.111/b28425/pipe_paral_tbl.htm

0
qo'shib qo'ydi
ha, ha! muammo shu.
qo'shib qo'ydi muallif hashir, manba
satrlarni olib tashlash tashvish emas, lekin funktsiyani ichidagi DMLni o'chirishga harakat qilsam, "Oracle" so'rovi ichidagi DML operatsiyasini amalga oshirib bo'lmaydi.
qo'shib qo'ydi muallif hashir, manba
OK. Men o'zimni o'chirishga harakat qilmadim, lekin bu xabar mantiqiy. Buni siz xohlagan tarzda (PL/SQL holda) mumkin emas.
qo'shib qo'ydi muallif BriteSponge, manba

Without pl/sql it's not possible.

Pl/sql-dan foydalanib siz qatorni to'ldiradigan va keyin o'chiradigan vazifani yaratishingiz mumkin

Mana misol:

drop table tempdate;
create table tempdate as
select '1' id from dual
UNION
select '2' id from dual


CREATE TYPE t_tf_row AS OBJECT (
  id           NUMBER
);


CREATE TYPE t_tf_tab IS TABLE OF t_tf_row;




CREATE OR REPLACE FUNCTION get_tab_tf RETURN t_tf_tab PIPELINED AS 
  PRAGMA AUTONOMOUS_TRANSACTION;
BEGIN
  FOR rec in (select * from tempdate) LOOP
    PIPE ROW(t_tf_row(rec.id));
  END LOOP;
  delete from  tempdate ; commit;
END;

select * from table(get_tab_tf)  -- it will populate and then delete

select * from tempdate   --you can check here result of deleting
0
qo'shib qo'ydi
men ma'lumotni foydalanuvchiga ko'rsatishni va keyinchalik xonadan so'ng ma'lumotlarni o'chirib qo'yishim kerak.
qo'shib qo'ydi muallif hashir, manba
sizning kodingiz kodi pl-sql so`ng edi, bu mening cheklovim edi. Faqat bitta sql so'rovi qabul qilinadi.
qo'shib qo'ydi muallif hashir, manba
@Kamil: ko'ngli, yordam uchun rahmat!
qo'shib qo'ydi muallif hashir, manba
@Maritime Bomber: ovqat yozuvlari bilan nimani anglatadi? iltimos bizni yoritib bera olasizmi?
qo'shib qo'ydi muallif hashir, manba
Men uni ishga tushiraman va qaytaman. sa'y-harakatlaringiz uchun tashakkur!
qo'shib qo'ydi muallif hashir, manba
Iltimos, kodni batafsil ishlab chiqing yoki qoldiring.
qo'shib qo'ydi muallif hashir, manba
Bu zarif yechimdir, lekin jimgina yeyish so'rovning boshlanishi va o'chirish boshlanishidan oldin kiritilgan yozuvlarni yozishi mumkin.
qo'shib qo'ydi muallif Marmite Bomber, manba
@hashir kodimni sinab ko'rdingizmi? siz uchun yaxshi emasmi? yoki har qanday muammolar bormi?
qo'shib qo'ydi muallif Kamil Ibadov, manba
@hashir Agar siz so'rovni boshlagan bo'lsangiz va u holda yangi qaydlar so'rovlar vaqtida kiritilsa, u holda yangi qaydlar o'chirilmaydi.
qo'shib qo'ydi muallif Kamil Ibadov, manba
U, xush kelibsiz :) Enjoy!
qo'shib qo'ydi muallif Kamil Ibadov, manba
Ha, 1 daqiqa ...
qo'shib qo'ydi muallif Kamil Ibadov, manba
Ha, siz funktsiyani satrda to'ldirish va ularni parallel o'chirish orqali ko'rsatishingiz mumkin
qo'shib qo'ydi muallif Kamil Ibadov, manba

siz quyida so'rov orqali foydalanishingiz mumkin

select * from Table_demo delete from Table_demo 
0
qo'shib qo'ydi

Table_Name'dan * ni tanlang;

Table_Name dan o'chirish

0
qo'shib qo'ydi