۶ مطلب با موضوع «Programming :: Oracle Technology :: Oracle SQL» ثبت شده است

نمایش کل متن sql از v$sql

خیلی وقتها که میخوایم وضعیت SQL STATEMENTهایی که یوزرها زدن رو ببینیم از ویوی V$SQL و معمولاً از کوئری‌ای شبیه زیر استفاده میکنیم:

select v.SQL_TEXT,
v.PARSING_SCHEMA_NAME,
v.FIRST_LOAD_TIME,
v.DISK_READS,
v.ROWS_PROCESSED,
v.ELAPSED_TIME,
v.service
from v$sql v
where to_date(v.FIRST_LOAD_TIME,'YYYY-MM-DD hh24:mi:ss')>ADD_MONTHS(trunc(sysdate,'MM'),-2)

نکته: WHERE تو کوئری بالا به صورت اختیاریه ولی درکل یادمون باشه میتونیم با استفاده از فیلد FIRST_LOAD_TIME رو تاریخ و زمان اجرای اون کوئری مانور بدیم تا گزارشهای بهتری داشته باشیم.

همونطور که می‌بینید ما اکثر مواقع از فیلد SQL_TEXT استفاده میکنیم ولی با توجه به اینکه میدونیم محدودیت کاراکتری VARCHAR2 دقیقا ۱۰۰۰ کاراکتره احتمالا خیلی از دستورات رو نمیتونیم به صورت کامل ببینیم

اینجاست که بهتره بدونیم V$SQL و V$SQLAREA شامل فیلدی به اسم SQL_FULLTEXT هستن که این فیلد تمام دستور SQL کاربر رو تو دیتاتایپ CLOB ذخیره میکنه پس میشه رشته‌ها رو تا حداکثر سایزی که یک STATEMENT میتونه باشه رو نشون داد(۴۰۰۰ کاراکتر) بیاین باهم ببینیم که چجوری میشه رشته‌ها رو از این فیلد استخراج کرد.

set linesize 132 pagesize 999
column sql_fulltext format a60 word_wrap
break on sql_text skip 1

select
replace(translate(sql_fulltext,'0123456789','999999999'),'9','')
SQL_FULLTEXT
from v$sql
where sql_text like '%TEXT IDENTIFIER%'
group by replace(translate(sql_fulltext,'0123456789','999999999'),'9','')
/

خروجی این دستور میتونه به این شکل باشه:

SQL_FULLTEXT 
------------------------------------------------------------ 
select /*aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa 
... query text ...
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa */ from b

امیدوارم براتون مفید باشه

۰۱ فروردين ۹۶ ، ۱۳:۲۹ ۰ نظر
مهدی غفاری

Fetching last record from a table

داشتم فکر می‌کردم که آیا راهی وجود داره که بشه آخرین رکورد از جدول رو بدست آورد. در این مورد مشخص و واضحه که از تعداد رکوردهای موجود در یک جدول بی اطلاع‌ام. فقط می‌خوام کوئری بنویسم که بتونه تمام ستون‌های آخرین رکورد رو بدست بیاره. من سعی کردم از ROWNUM استفاده کنم، اما حدس می‌زنم که شیوه‌ کار اینطور نیست. اگر یک گزارشی ایجاد کنم، می‌خوام که گزارش‌ام بر پایه‌ی کوئری باشه که به سادگی تمام ستون‌های آخرین رکورد رو بدست بیاره.

آیا دستوری وجود داره که بشه باهاش آخرین رکورد از جدول رو بدست آورد؟

با تشکر

حسن

 

تعریف تو از آخرین رکورد چیه؟

می‌دونی که آخرین رکورد درج شده در جدول می‌تونه اولین رکورد‌ی باشه که توسط “select * from t” بازگشت داده میشه یا ممکنه صدمی باشه، ممکنه هزارمی باشه، در واقع می‌تونه هر رکورد‌ای باشد.

یادت باشه رکوردها در هیچ ترتیب خاصی ذخیره و بازگردونی نمیشن.

ولی اگه آخرین رکورد درج شده را می‌خوای، باید یک فیلد timestamp یا sequence ای برای هر رکورد‌ای که درج می‌شه موقع درج رکورد مشخص کنی اینجوری «آخرین» رکورد رو میتونی داشته باشی یادت باشه این تنها راه است.

یادت باشه تنها راه برای انجام این کار اینه که ستونی داشته باشی که بتونی مرتبش کنی تا «آخرین» رکورد رو پیدا کنی.

 

ROWID و ROWNUM به دلایل زیر کار نمی‌کنند:

ROWID کار نمیکنه. چون داده‌اش بر پایه‌ی ترکیبی از شماره file/block/slot سرور فعلی است. یادت باشه ما از ROWID ها دوباره استفاده می‌کنیم، حتی می‌تونیم تغییرشون بدیم (مثلا با پارتیشن‌بندی جداول). پس ممکنه که Extent شماره‌ی 1 رو در فایل 55 و Extent شماره‌ی 2 رو در فایل 2 داشته باشید. Extent 4 حتی ممکنه در بلاک 555 از فایل 3 باشه، حتی ممکنه Extent 5 در بلاک 2 از فایل 3 باشه. ROWIDها قابل مرتب کردن نیستند.

 

ROWNUM هم کار نمیکنه چون یک ستون منطقیه(در جدول درج نشده) و با هر SELECT شماره ردیف رکوردهای SELECT مربوط رو برمیگردونه

منبع

۲۴ اسفند ۹۴ ، ۰۸:۳۷ ۰ نظر
مهدی غفاری

توابع زبان SQL در اوراکل

تمام دیتابیس‌ها یسری FUNCTIONها دارند که ما می‌توانیم از این فانکشن‌ها استفاده کنیم.

فانکشن‌ها قطعه کدهایی هستند، که از پیش تعریف شده‌اند تا شما را در امور مختلف یاری نمایند. لازم به ذکر است شما می‌توانید در زبانی دیگر، به نام PL-SQL توابعی را به دلخواه، طراحی و در دستورات SQL از آن استفاده نمایید. فانکشن‌ها، موارد زیر را شامل می‌شوند:

  • فانکشن‌های پردازش‌رشته،
  • فانکشن‌های ریاضی،
  • فانکشن‌های تاریخ و زمان،
  • فانکشن‌های جمعی،
  • و سایر فانکشن‌ها

همچنین این فانکشن‌ها ۲ گروه عمده رو تشکیل می‌دهند:

  1. فانکشن‌های یک RESULTای
    1. یعنی وقتی فانکشن رو روی یک جدول صدا می‌کنیم فقط یک RESULT برمی‌گردونه
  2. فانکشن‌های چند RESULTای
    1. یعنی وقتی فانکشن رو روی یک جدول صدا می‌کنیم به ازای هر رکورد یک RESULT جدید برمی‌گردونه

فانکشن‌ها در دیتابیس‌های مختلف متفاوت‌اند در برخی از دیتابیس‌ها یکسری فانکشن‌ها موجوده و در برخی موجود نیست. زبان SQL یک زبان عمومی است و ساختار آن در تمام بانک‌های اطلاعاتی یکسان است اما فانکشن‌های موجود در هر بانک‌اطلاعاتی با بانک‌های اطلاعاتی دیگر متفاوت است.

اوراکل یکی از پر تعدادترین فانکشن‌ها را در میان بانک‌های‌اطلاعاتی دارد. بعد از اوراکل MYSQL و بعد از اون DB2 و بعد از DB2 پرتعداترین فانکشن را MS SQL SERVER دارد.

۳۰ فروردين ۹۴ ، ۰۹:۵۸ ۰ نظر
مهدی غفاری

زبان SQL - قسمت دوم

ساخت جدول

دستور زیر جدولی به اسم PERSON با فیلدهای ID, NAME, AGE با نوع‌های مشخص ایجاد می‌کند(ID, AGE اطلاعات عددی نگه‌می‌دارن و NAME اطلاعات رشته‌ای، همچنین این جدول در یوزر MGHAFFARI ساخته شده است):

SQL> CREATE TABLE PERSON(ID NUMBER, NAME VARCHAR2(20), AGE NUMBER);

Table created.
SQL> show user;
USER is "MGHAFFARI"

ورود اطلاعات

برای ورود اطلاعات از دستور INSERT به شکل زیر استفاده می‌کنیم:

SQL> INSERT INTO PERSON(ID, NAME, AGE) VALUES(1, 'MAHDI', 21);

1 row created.

SQL> INSERT INTO PERSON(ID, NAME, AGE) VALUES(2, 'EHSAN', 22);

1 row created.

SQL> INSERT INTO PERSON(ID, NAME, AGE) VALUES(3, 'FARZAD', 25);

1 row created.

برای نمایش اطلاعات از دستور SELECT استفاده می‌کنیم:

SQL> SELECT * FROM PERSON;

ID NAME AGE
---------- -------------------- ----------
1 MAHDI 21
1 EHSAN 22
1 MAHDI 21
2 EHSAN 22
3 FARZAD 25

نکته: حتما بعد از INSERT اطلاعات عمل COMMIT را انجام دهید وگرنه TRANSACTION بعد از بستن محیط یا هر اتفاقی ROLLBACK میشه.

نکته: برای دستورات CREATE نیازی به COMMIT نیست و فقط برای دستوراتی که مستقیماً با DATA طرف هستند و درج یا آپدیتی انجام می‌دهند باید عمل COMMIT صورت گیرد.

نکته: MGHAFFARI تا قبل از ایجاد جدول و ورود داده فقط یوزر بود ولی بعد از ایجاد جدول و ورود داده SCHEMA شد.

اگر بخواهیم از یوزر دیگری به جداول یوزر دیگر دسترسی داشته باشیم به شکل کلی زیر عمل می‌کنیم:

SELECT * FROM SCHEMA_NAME.OBJECT_NAME;

به عنوان مثال برای SELECT PERSON از یوزر SYSTEM به صورت زیر عمل می‌کنیم:

SQL> connect system;
Enter password:
Connected.
SQL> SELECT * FROM MGHAFFARI.PERSON; ID NAME AGE
---------- -------------------- ----------
1 MAHDI 21
1 EHSAN 22
1 MAHDI 21
2 EHSAN 22
3 FARZAD 25

ادامه مطلب...
۲۱ فروردين ۹۴ ، ۱۱:۲۱ ۰ نظر
مهدی غفاری

زبان SQL - قسمت اول

ساخت کاربر

کاربران موجودیت‌هایی هستند، که اجازه ورود به پایگاه داده‌ای اوراکل را دارند. نحوه‌ی نگارش دستور ساخت کاربر به اشکال ذیل می‌باشد.

CREATE USER user_name
IDENTIFIED BY my_pass;

در قسمت CREATE USER، نام کاربر و IDENTIFIED BY، رمز ورود کاربر وارد می‌گردد.
با استفاده از دستور CREATE USER یک کاربر به نام ریحانه، با رمز ورود ABC بسازید.

SQL> CREATE USER MAHDI
2 IDENTIFIED BY ABCD;

User created.

SQL>

با استفاده از دستور SHOW USER  نام کاربر متصل به بانک‌اطلاعاتی را نمایش داده می‌شود.

SQL> SHOW USER;
USER is "SYS"
SQL>

در حال حاضر کاربر SYSTEM به بانک اطلاعاتی متصل است.

حذف کاربر

برای حذف یک کاربر از دستور DROP USER استفاده می‌شود. نگارش این دستور به شکل زیر است.

DROP USER user_name;

در صورت استفاده از CASCADE در دستور DROP USER، کاربر با تمام ملحقات مربوطه(تمامی جداول، دیدها و ...) حذف می‌گردد.

SQL> DROP USER MAHDI CASCADE;

User dropped.

SQL>

ادامه مطلب...
۱۹ فروردين ۹۴ ، ۱۵:۳۷ ۳ نظر
مهدی غفاری

زبان SQL

SQL یک زبان غیر رویه‌ای (non procedural) می‌باشد. یعنی از طریق SQL انجام Query و تغییرات در بانک‌های اطلاعاتی انجام می‌شود بدون این که کاربر چگونگی انجام کار را برای SQL مشخص نماید. 
در SQL امکان تعریف تابع، شرط و حلقه وجود ندارد. برای حل این مشکل، Oracle از بسط یافتن زبان SQL به نام PL/SQL استفاده می‌کند. 

در نگاه کلی به SQL، دستورات آن به ۵ گروه زیر تقسیم می‌شوند: 

  1. (Data Manipulate Language (DML: برای جستجو و یا تغییر داده‌ها
  2. (Data Definition Language (DDL: برای تعریف ساختار بانک‌اطلاعاتی
  3. (Data Control Language (DCL: برای تعریف سطح دسترسی کاربران به بانک‌اطلاعاتی
  4. (Data Query Language (DQL: برای بازیابی اطلاعات
  5. (Transaction Control Language (TCL: برای کنترل تراکنش‌ها


دستورات DML به 4 دسته زیر تقسیم می شوند:

  1. Insert: افزودن رکوردهای جدید به یک جدول
  2. Update: تغییر رکوردهای موجود یک جدول
  3. Delete: حذف رکوردهای موجود یک جدول
  4. Merge: درج رکورد جدید و یا تغییر رکوردهای موجود

ادامه مطلب...
۱۱ اسفند ۹۳ ، ۱۵:۴۳
مهدی غفاری