কলামের নামগুলি আনতে ওরাকল ক্যোয়ারী


123

এই জাতীয় টেবিল থেকে কলামগুলি পেতে আমার কাছে একটি মাইএসকিউএল কোয়েরি রয়েছে:

String sqlStr="select column_name 
from information_schema.COLUMNS 
where table_name='users' 
and table_schema='"+_db+"' 
and column_name not in ('password','version','id')"

ওরাকল 11 জি ডাটাবেসে আমি কীভাবে উপরের ক্যোয়ারীটি পরিবর্তন করব? স্কিমা উল্লেখ করে নির্দিষ্ট কলামগুলি বাদ দিয়ে সারণীর ব্যবহারকারীদের জন্য ফলস্বরূপ হিসাবে কলামের নামগুলি পাওয়া দরকার। এই মুহুর্তে আমার নতুন টেবিল স্পেসে সমস্ত টেবিল রয়েছে, তাই আমি কি স্কিমা নামের জায়গায় টেবিলস্পেসের নামটি নির্দিষ্ট করব?

এছাড়াও এর জন্য কি জেনেরিক এইচকিউএল আছে? আমার নতুন ওরাকল ডাটাবেসে (আমি ওরাকল থেকে নতুন) আমার কেবল টেবিল স্পেসের নাম রয়েছে, তবে এটি কি স্কিমা নামের সমতুল্য (যৌক্তিকভাবে?)

উত্তর:


176

জন্য ওরাকল সমতুল্য information_schema.COLUMNSহয় USER_TAB_COLSবর্তমান ব্যবহারকারীর মালিকানাধীন টেবিলের জন্য, ALL_TAB_COLSবা DBA_TAB_COLSসকল ব্যবহারকারীর মালিকানাধীন টেবিলের জন্য।

টেবিলস্পেস কোনও স্কিমার সমতুল্য নয়, আপনাকে টেবিলস্পেসের নামও সরবরাহ করতে হবে না।

আপনি যদি জিজ্ঞাসা করতে চান ALL_TAB_COLSবা DBA_TAB_COLSকোনও নির্দিষ্ট ব্যবহারকারীর মালিকানাধীন টেবিলের কলামগুলির জন্য স্কিমা / ব্যবহারকারীর নাম সরবরাহ করা কার্যকর হবে । আপনার ক্ষেত্রে, আমি জিজ্ঞাসা করছিলাম যে ক্যোয়ারীটি এমন কিছু দেখাচ্ছে:

String sqlStr= "
SELECT column_name
  FROM all_tab_cols
 WHERE table_name = 'USERS'
   AND owner = '" +_db+ "'
   AND column_name NOT IN ( 'PASSWORD', 'VERSION', 'ID' )"

মনে রাখবেন যে এই পদ্ধতির সাহায্যে আপনি এসকিউএল ইঞ্জেকশন ঝুঁকিপূর্ণ করেন।

সম্পাদনা: সারণী- এবং কলামের নামগুলি বড় করে দেওয়া হয়েছে কারণ এগুলি সাধারণত ওরাকলে বড় হাতের অক্ষর; তারা কেবল নিম্ন- বা মিশ্র কেস যদি তাদের চারপাশে ডাবল উদ্ধৃতি দিয়ে তৈরি করা হয়।


2
যাইহোক, আমি জেডিবিসি-র মাধ্যমে ডেটাবেস নির্বিশেষে এই কাজ করার একটি সাধারণ উপায় খুঁজে পেয়েছি .. এখানে লিঙ্কটি সহ: কোডেজভা.অর্গ
১.h১৩

আমাকে and virtual_column = 'NO'আমার প্রশ্নের সাথে যুক্ত করতে হয়েছিল।
musicin3d

101

নীচের কোয়েরিটি ওরাকল ডাটাবেসে আমার জন্য কাজ করেছিল।

select COLUMN_NAME from ALL_TAB_COLUMNS where TABLE_NAME='MyTableName';

26
মনে রাখবেন যে ওরাকল কেস-সংবেদনশীল। আমি সাধারণত ব্যবহার ...WHERE LOWER(Table_Name) = 'mytablename';

2
@ user565869 আমি ব্যবহার করব where lower(TABLE_NAME) = lower('WHATEVER'), অন্যথায় যখন টেবিলের নামটিতে কিছু বড় অক্ষর থাকে তবে এটি টেবিলটিও খুঁজে পাবে না
আলেকজান্ডার

SELECT column_name FROM all_tab_cols WHERE UPPER(Table_Name) = UPPER('tablename');ঠিক পাশাপাশি কাজ করে।
ব্যবহারকারী 3553260

সরবরাহের সাথে তুলনা করার আগে তার সমস্ত মান পেতে টেবিলের একটি টেবিল স্ক্যান করতে ওরাকল ব্যবহার lower(TABLE_NAME)বা upper(TABLE_NAME)প্রয়োজন হয় । দ্রুত পরীক্ষায় এটি আমার উদ্দেশ্যটির জন্য পারফরম্যান্সকে অযোগ্য করে তোলে তাই আমি কেস সংবেদনশীল তুলনা করেই থাকব। ALL_TAB_COLUMNSTABLE_NAMEUPPER('MyTableName')
ক্রিস ম্যাগনসন

40

ওরাকল আপনি ব্যবহার করতে পারেন

desc users

ব্যবহারকারীদের সারণীতে থাকা সমস্ত কলাম প্রদর্শন করতে


6
... কারণ যদিও এটি 'কোনও টেবিলের সমস্ত কলামের তালিকা কীভাবে পাওয়া যায়' তার উত্তরের প্রতিনিধিত্ব করে, এটি জিজ্ঞাসা করা প্রশ্নের উত্তর দেয় না: 1) এটি কোনও জিজ্ঞাসা নয়, ২) এটি সীমাবদ্ধ করে না / ফিরে আসা কলামগুলি ফিল্টার করুন, 3) এটি কি ফলাফলের সেটটি ফিরিয়ে দিচ্ছে?
এহ্রাইক

6
Upvotes অভাব desc usersকিছু প্রশ্নের খারাপ উত্তর দেয় না , তবে এটি এই উত্তর একটি ভাল উত্তর না ।
এহ্রাইক

এবং কারণ এটি কোনও স্কিল কোয়েরি নয়, বরং এটি এসকিএল * প্লাস কমান্ড। আরও তথ্যের জন্য এটি চেকআউট করুন: স্ট্যাকওভারফ্লো
প্রশ্নগুলি

7

আপনি এটি চেষ্টা করে দেখতে পারেন: (এটি 11 গ্রামে কাজ করে এবং এটি একটি টেবিল থেকে সমস্ত কলামের নাম ফেরত দেয়, এখানে টেস্ট_টিবিএলটি সারণির নাম এবং ব্যবহারকারী_ত্যাব_কলামগুলি ব্যবহারকারী অনুমোদিত টেবিলের কলামগুলি)

select  COLUMN_NAME  from user_tab_columns
where table_name='test_tbl'; 


1
USER_TAB_COLUMNSপ্রকৃতপক্ষে ব্যবহারকারীর মালিকানাযুক্ত টেবিলগুলির কলামগুলি ব্যবহারকারীর কাছে থাকা টেবিলগুলির নয়।
ডেভিড ফ্যাবার

2

ওরাকল এর সাথে ব্যবহার করার ক্যোয়ারীটি হ'ল:

String sqlStr="select COLUMN_NAME from ALL_TAB_COLUMNS where TABLE_NAME='"+_db+".users' and COLUMN_NAME not in ('password','version','id')"

এই জাতীয় প্রশ্নের জন্য এইচকিউএল সম্পর্কে কখনও শুনিনি। আমি ধরে নিলাম ওআরএম বাস্তবায়নের সাথে এটির মোকাবিলা করার কোনও অর্থ নেই। ওআরএম হ'ল একটি অবজেক্ট রিলেশনাল ম্যাপিং এবং আপনি যা সন্ধান করছেন তা হচ্ছে মেটাডেটা ম্যাপিং ... আপনি এইচকিউএল ব্যবহার করবেন না, বরং এই উদ্দেশ্যে এপিআই পদ্ধতি ব্যবহার করবেন বা সরাসরি এসকিউএল ব্যবহার করবেন না। উদাহরণস্বরূপ, আপনি JDBC এর ব্যবহার করতে পারেন DatabaseMetaData

আমি মনে করি টেবিল স্পেসের সাথে স্কিমা কিছুই করার নেই। আফাইক টেবিল স্পেসগুলি মূলত যৌক্তিক অভ্যন্তরীণ প্রযুক্তিগত উদ্দেশ্যে ব্যবহৃত হয় যা ডিবিএকে বিরক্ত করে। টেবিল স্পেসগুলি সম্পর্কিত আরও তথ্যের জন্য, ওরাকল ডকটি দেখুন


TABLE_NAME='"+_db+".users'অকৃতকার্য হবে; আপনার মালিক / স্কিমা এবং টেবিলের নাম আলাদা করতে হবেALL_TAB_COLUMNS
ডেভিড ফ্যাবার

2

আমি কলামের নামগুলি অর্জন করতে সক্ষম হয়েছি কেবলমাত্র নিম্নলিখিত কোয়েরিটি ব্যবহার করছিলাম:

select COLUMN_NAME
FROM all_tab_columns atc
WHERE table_name like 'USERS'

2

মুল বক্তব্যটি হ'ল আপনাকে কীভাবে টেবিলের নাম মূলধনটি লিখতে হবে:

select *
FROM all_tab_columns
where table_name like 'IDECLARATION';

1

আমি ওরাকল এ একটি দরকারী মনে করি:

SELECT 
    obj.object_name, 
    atc.column_name, 
    atc.data_type, 
    atc.data_length 
FROM 
    all_tab_columns atc,
    (SELECT 
        * 
     FROM 
         all_objects
     WHERE 
        object_name like 'GL_JE%'
        AND owner = 'GL'
        AND object_type in ('TABLE','VIEW')   
    ) obj
WHERE 
    atc.table_name = obj.object_name
ORDER BY 
    obj.object_name, 
    atc.column_name;

এই উত্তরটি পড়তে খুব কষ্ট হয়। পুনর্নির্মাণ বিবেচনা করুন।
ছারভে

যদি একই নামের একাধিক টেবিল থাকে তবে বিভিন্ন মালিক?
ডেভিড ফ্যাবার

1

বেশ কয়েকটি অনুষ্ঠানে, আমাদের স্কিমাতে একটি টেবিল থেকে সমস্ত কলামের কমা পৃথকীর্ণ তালিকা প্রয়োজন। এই জাতীয় ক্ষেত্রে আমরা এই জেনেরিক ফাংশনটি ব্যবহার করতে পারি যা কমা দ্বারা বিচ্ছিন্ন তালিকাটিকে স্ট্রিং হিসাবে আনে।

CREATE OR REPLACE FUNCTION cols(
    p_schema_name IN VARCHAR2,
    p_table_name  IN VARCHAR2)
  RETURN VARCHAR2
IS
  v_string VARCHAR2(4000);
BEGIN
  SELECT LISTAGG(COLUMN_NAME , ',' ) WITHIN GROUP (
  ORDER BY ROWNUM )
  INTO v_string
  FROM ALL_TAB_COLUMNS
  WHERE OWNER    = p_schema_name
  AND table_name = p_table_name;
  RETURN v_string;
END;
/

সুতরাং, কেবল ক্যোয়ারী থেকে ফাংশনটি কল করা সমস্ত কলামগুলির সাথে একটি সারি দেয়।

select cols('HR','EMPLOYEES') FROM DUAL;

EMPLOYEE_ID,FIRST_NAME,LAST_NAME,EMAIL,PHONE_NUMBER,HIRE_DATE,JOB_ID,SALARY,COMMISSION_PCT,MANAGER_ID,DEPARTMENT_ID

দ্রষ্টব্য: LISTAGG সমস্ত কলামের সম্মিলিত দৈর্ঘ্যটি 4000বিরল যা অক্ষর অতিক্রম করবে fail বেশিরভাগ ক্ষেত্রে, এটি কাজ করবে।


0
  1. SELECT * FROM <SCHEMA_NAME.TABLE_NAME> WHERE ROWNUM = 0;-> নোট করুন যে, এটি ক্যোয়ারী ফলাফল, ফলাফল ফলাফল। এটি অন্যান্য ফর্ম্যাটে রফতানিযোগ্য। এবং, আপনি রপ্তানি করতে পারেন ক্যোয়ারী ফলাফল থেকে Textবিন্যাস। রফতানি নীচের মত দেখতে যখন আমি করলাম SELECT * FROM SATURN.SPRIDEN WHERE ROWNUM = 0;:

    "SPRTELE_PIDM" "SPRTELE_SEQNO" "SPRTELE_TELE_CODE" "SPRTELE_ACTIVITY_DATE" "SPRTELE_PHONE_AREA" "SPRTELE_PHONE_NUMBER" "SPRTELE_PHONE_EXT" "SPRTELE_STATUS_IND" "SPRTELE_ATYP_CODE" "SPRTELE_ADDR_SEQNO" "SPRTELE_PRIMARY_IND" "SPRTELE_UNLIST_IND" "SPRTELE_COMMENT" "SPRTELE_INTL_ACCESS" "SPRTELE_DATA_ORIGIN" "SPRTELE_USER_ID" "SPRTELE_CTRY_CODE_PHONE "" SPRTELE_SURROGATE_ID "" SPRTELE_VERSION "" SPRTELE_VPDI_CODE "

  2. DESCRIBE <TABLE_NAME> -> দ্রষ্টব্য: এটি স্ক্রিপ্ট আউটপুট।


-1

আপনি সারণির নামের তালিকা পেতে ডিবি 2-তে নির্দিষ্ট কলামটি ব্যবহার করতে নীচের ক্যোয়ারীটি ব্যবহার করতে পারেন:

SELECT TBNAME                
FROM SYSIBM.SYSCOLUMNS       
WHERE NAME LIKE '%COLUMN_NAME'; 

দ্রষ্টব্য: এখানে COLUMN_NAMEআপনি যে কলামটির নামটি সন্ধান করছেন তার সাথে প্রতিস্থাপন করুন ।


উত্তর দেওয়ার জন্য আপনার ডিবি 2 প্রশ্নের সন্ধান করা উচিত? আমি সন্দেহ করি যে ওরাকল সন্ধান করা কারও ডিবি 2 উত্তর প্রয়োজন হবে।
রিচার্ডকিকি

1
এই উত্তরটি আসলে আমাকে সাহায্য করেছিল। আমি ওরাকল মোডে DB2 ব্যবহার করছি এবং এটি all_tab_col সমর্থন করে না।
wm_eddie

-1

আপনি এটি চেষ্টা করতে পারেন:

'সারণির নাম' বর্ণনা করুন

এটি সমস্ত কলামের নাম এবং ডেটা প্রকার ফেরত দেবে

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.