ফাঁকা, আধা-কলোন এবং ফরোয়ার্ড স্ল্যাশযুক্ত এসকিউএলপ্লাসের সাথে একটি স্ক্রিপ্ট কার্যকর করুন


15

মাঝে মাঝে আমি একটি স্ক্রিপ্ট পাব যা এসকিউএল বিকাশকারী বা টোডে সূক্ষ্মভাবে চলবে তবে এসকিউএল * প্লাস থেকে সফলভাবে চালনার জন্য পরিবর্তন প্রয়োজন। খালি রেখাগুলি, সেমিকোলন এবং ফরোয়ার্ড স্ল্যাশ সহ একাধিক বিবৃতি সম্বলিত একটি নিকৃষ্টতম উদাহরণ এখানে রয়েছে:

INSERT INTO t1 VALUES ('a

;
/
');

INSERT INTO t1 VALUES ('b

;
/
');

DELETE FROM t1 WHERE c1 = 'c

;
/
';

বিভিন্ন কারণে এই বিবৃতিগুলি এসকিউএল * প্লাস থেকে চালানো দরকার। ফাঁকা লাইনগুলি একটি সাধারণ দিয়ে সমাধান করা সহজ ...

set sqlblanklines on

আমি সচেতন যে sqlterminatorপরিবর্তন করা যায় এবং / অথবা বন্ধ করা যেতে পারে, তবে উভয়ের কোডেই সংশোধন করা দরকার, প্রাক্তন সমস্যা সমাধান না করেই সরায় এবং এম্বেড থাকা স্ল্যাশ সমস্যার সমাধানও করে না।

সর্বোত্তম উত্তরটি হ'ল পরিবেশকে কোনওভাবে পরিবর্তন করে (যেমন স্ক্যালব্ল্যাঙ্কলাইনস করে) এই পরিবর্তনগুলি কোনও পরিবর্তন ছাড়াই চালানোর অনুমতি দেবে। যদি এটি সম্ভব না হয়, তবে সম্ভবত স্ক্রিপ্টগুলি প্রোগ্রামগতভাবে সংশোধন করার কোনও উপায় আছে। আমি ম্যানুয়াল পরিবর্তনগুলি এড়াতে চেষ্টা করছি।


এসকিউএলপিএলএস-র কমান্ড লাইন কার্যকর করার সময় এই সমস্যাটি সহজেই ঘটতে পারে। আপনি এসকিউএলপিএলএস প্রোগ্রামের ভিতরে থাকা অবস্থায়, কমান্ড লাইন সম্পাদকটি এখনও সক্রিয় রয়েছে। ফলস্বরূপ, কমান্ড লাইন সম্পাদকের সাথে প্রাসঙ্গিক আইটেমগুলি (ফাঁকা স্থানগুলি কমান্ড / ভেরিয়েবল হিসাবে ব্যাখ্যা করা হয়, আধা-কলোনগুলি কমান্ডের শেষ হিসাবে দেখা হয়)। এজন্য পাসওয়ার্ডে একটি '@' থাকার ফলে আপনি সাইন ইন করার চেষ্টা করার সময় হৃদয় ব্যথার কারণ হয় না (@ এর ডানদিকে সমস্ত কিছু ডিবির নাম হিসাবে দেখা হয়)। একটি বড় মোতায়েনের সময়, আমরা ফাঁকা জায়গাগুলি নিয়ে এমন সমস্যা পেয়েছি যা আমাদের টোডের মাধ্যমে স্টাফ মোতায়েন করতে বাধ্য করেছিল। এসকিউএলপিএলএস অকেজো ছিল
টমভি

আপনার ভাবনার জন্য আপনাকে ধন্যবাদ. সুতরাং, আপনার উত্তরটি কি স্পষ্ট করে বলা যায় যে আমি যা অনুরোধ করছি তা অসম্ভব?
লেইফ রিফেল

আপনি কি স্ট্রিংয়ের মধ্যে গাড়ীর রিটার্নকে chr (10) এর সন্নিবেশকে এক লাইনে তালিকাবদ্ধ করে রূপান্তর করতে পারবেন?
ক্রিস

@ ক্রিসস্যাক্সন আমি পারব, তবে এই সমস্যাটি কীভাবে এনকোড হওয়া উচিত এবং কীভাবে সিনট্যাক্সের অংশ হিসাবে একা থাকা দরকার তা প্রত্যাবর্তন করতে পারে। যদি আপনার এই করার কোনও উপায় থাকে তবে দয়া করে একটি উত্তর হিসাবে পোস্ট করুন।
লেইফ রিফেল

উত্তর:


8

আপনি login.sql ব্যবহার করে এর বেশিরভাগটি করতে পারেন। লগইন.এসকিউএল - আশ্চর্যজনক - লগইন চলাকালীন কার্যকর হয় এবং আপনার এসকিউএলপ্যাট বা বর্তমান ডিরেক্টরি থেকে লোড হয়। আপনি যে উদাহরণ দিয়েছেন তার জন্য, আপনি সত্যই সবচেয়ে খারাপ ক্ষেত্রে বেছে নিয়েছেন।

সমস্যা হ'ল স্কেল্টারমিনেটর। আপনি সেখানে যা কিছু রাখুন না কেন, ফরোয়ার্ড স্ল্যাশটি একটি ফ্রি স্ক্যাল্টারমিনেটর হিসাবে বজায় থাকে। তার পাশেই, স্ক্যালপ্লাস প্রথমে স্ক্লটারমিটারের জন্য স্ক্যান করে এবং স্ট্রিং টার্মিনেটরে স্ক্যান করার আগে এটি করে। আপনি আমাকে জিজ্ঞাসা যদি একটি বাগ। ফরোয়ার্ড স্ল্যাশ স্ট্রিংতে ব্যবহার করা যেতে পারে যতক্ষণ না এটি পৃথক লাইনে একা না থাকে। স্কলপ্লাস স্কেল্টারমিটার হিসাবে বর্ণিত চরিত্রটি খুঁজে পাওয়ার সাথে সাথে এটি অন্য সমস্ত কিছুকে উপেক্ষা করে পড়া বন্ধ করে দেয়।

ফরোয়ার্ড স্ল্যাশ পরিচালনা করা যায়, যতক্ষণ না এটি কোনও লাইনে একা না থাকে।

login.sql এর মধ্যে রয়েছে:

prompt run login.sql
show sqlterminator
show sqlblanklines
set sqlblanklines on
set sqlterminator ';'
show sqlterminator
show sqlblanklines
prompt ready login.sql
set echo on

leigh.sql এর মধ্যে রয়েছে:

INSERT INTO t1 VALUES ('fail bc semicolon
a;a
/
'); 

INSERT INTO t1 VALUES ('fail bc solo /


aa
/
');

INSERT INTO t1 VALUES ('ok / not solo


aa
/a
');

DELETE FROM t1 WHERE a = 'c


a/
';

স্ক্রিপ্টটি চালান:

sqlplus leigh/leigh@orcl @leigh
SQL*Plus: Release 10.2.0.4.0 - Production on Thu Aug 9 22:36:20 2012

Copyright (c) 1982, 2007, Oracle.  All Rights Reserved.


Connected to:
Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - 64bit Production
With the Partitioning, Real Application Clusters, Automatic Storage Management, OLAP,
Data Mining and Real Application Testing options

run login.sql
sqlterminator ";" (hex 3b)
sqlblanklines OFF
sqlterminator ";" (hex 3b)
sqlblanklines ON
ready login.sql
SQL> INSERT INTO t1 VALUES ('fail bc semicolon
  2  a;a
  3  /
ERROR:
ORA-01756: quoted string not properly terminated


SQL> ');
SP2-0042: unknown command "')" - rest of line ignored.
SQL> 
SQL> INSERT INTO t1 VALUES ('fail bc solo /
  2  
  3  
  4  aa
  5  /
ERROR:
ORA-01756: quoted string not properly terminated


SQL> ');
SP2-0042: unknown command "')" - rest of line ignored.
SQL> 
SQL> INSERT INTO t1 VALUES ('ok / not solo
  2  
  3  
  4  aa
  5  /a
  6  ');

1 row created.

SQL> 
SQL> DELETE FROM t1 WHERE a = 'c
  2  
  3  
  4  a/
  5  ';

0 rows deleted.

প্রারম্ভিক / শেষের ব্লকগুলি নিয়ে গলগল করার দরকার নেই। কমান্ডের ভিতরে স্ক্লটারমিটারকে পরিচালনা করতে পারে না, এটি যেখানেই থাকুক না কেন, স্ট্রিংয়ে থাকুক বা না থাকুক, স্ট্রিংয়ের লাইনে একা ফরোয়ার্ড স্ল্যাশ সহ লাইনগুলি হ্যান্ডেল করতে পারে না।


1
প্রমাণের জন্য আপনাকে ধন্যবাদ। আমি ইতিমধ্যে একইভাবে একটি login.sql ফাইল সেটআপ ব্যবহার করছি। সুতরাং মূলত এটি নিশ্চিত করে যে আমি কেন করতে চাই তা করা যায় না।
লেইফ রিফেল

1
কিছুটা পার্থক্য হ'ল একটি রানার স্ক্রিপ্ট ব্যবহার করা যা সেটিংসটি করে এবং আসল স্ক্রিপ্টটি কল করে। স্কয়ারপ্লাস লেইগ / লেইইউ হয়ে যাবে এটি লগইন
এসকিএল থেকে

1

খালি লাইন এবং আধা-কলোন সহ বিবৃতি সন্নিবেশ করা সফল হবে যদি বিগইন ... এন্ড ব্লকের ভিতরে রাখে। এই পরিবর্তনটি কোনও স্ক্রিপ্ট ব্যবহার করে করা যেতে পারে, তবে স্ক্রিপ্টটি যদি ডিডিএল বিবৃতি থাকে যা অবিলম্বে কার্যকর না করে কোনও ব্লকের ভিতরে চালানো যায় না।

এই সমাধানটি এম্বেড / ইস্যুও সমাধান করে না।


অতীতে আমি স্কেলপ্লাস এড়াতে এটি করার জন্য পার্ল / ডিবিডি স্ক্রিপ্ট ব্যবহার করেছি। ভাগ করে নেওয়ার জন্য খুশি ...
ফিলি

@ ফিল আপনাকে ধন্যবাদ, তবে এসকিউএলপ্লাস ৯৯.৯% পরিস্থিতিতে ঠিকঠাক কাজ করে, তাই আমি মিশ্রণের পরিবর্তে অন্য কোনও সরঞ্জাম যুক্ত করব না।
লেইফ রিফেল

1

আমার কার্যনির্বাহী:

         begin
             INSERT INTO t1 VALUES ('a

             ;
             ');
         end;
         /

দেখে মনে হচ্ছে বডি স্টেটমেন্টের ভিতরে কমান্ড টার্মিনেটর উপেক্ষা করা হয়েছে।


এটি কেন ডিডিএল স্টেটমেন্ট বা এম্বেডড স্ল্যাশগুলির জন্য ভাল সমাধান নয় তা জন্য আমার উত্তর দেখুন।
লেফ রিফেল

-1
set sqlterminator OFF
<...>
set sqlterminator ON

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