পিএসকিএলে আর্গুমেন্ট পাস করা


10

আমি Postgres 8.3 এ একটি plpgsql স্ক্রিপ্ট চালাচ্ছি - আমি পিএসকিএল এর মাধ্যমে এই স্ক্রিপ্টটিতে যুক্তিগুলি দিতে চাই। আমি বর্তমানে স্ক্রিপ্টটি সম্পাদন করছি:

psql -d database -u user -f update_file.sql 

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

-bash-3.2$ export PGOPTIONS='--pretend=true'
-bash-3.2$ psql -d my_db -f update_database.sql
psql: FATAL:  unrecognized configuration parameter "pretend"

অন্য কোন ধারণা? আদর্শভাবে আমি পরিবেশের পরিবর্তনগুলি এড়াতে চাই ...


আমি মনে করি আপনি -vপিএসকিএল এর যুক্তি সন্ধান করছেন।
dezso

আমি চেষ্টা করেছিলাম - স্ক্রিপ্টে এটি পুনরুদ্ধার করার জন্য, আমি "SELECT বর্তমান_সেটিং ('ভান করা') INTO _result" বলছি - কোনও সাফল্য নেই।
Jmoney38

উত্তর:


5

কড়া কথায় বলতে গেলে, "plpgsql স্ক্রিপ্ট" বলে কিছুই নেই - পিএল / পিজিএসকিউএল পোস্টগ্রাইএসকিউএল এর ডিফল্ট পদ্ধতিগত ভাষা। এটি হয় একটি এসকিউএল স্ক্রিপ্ট বা একটি plpgsql ফাংশন / পদ্ধতি। আপনার উদাহরণটি একটি এসকিউএল স্ক্রিপ্ট নির্দেশ করে বলে মনে হচ্ছে।

আপনি এর পরিবর্তে একটি (সার্ভার-সাইড) পিএলপজিএসকিএল (বা এসকিউএল) ফাংশন তৈরি করতে পারেন, এতে যে কোনও সংখ্যক আর্গুমেন্ট লাগে। ততক্ষণ ততক্ষণ ততক্ষণ তর্ক values। যুক্তি শনাক্তকারীদের অন্তর্ভুক্ত করা হলে এটি কিছুটা জটিল হয়ে যায়। তারপরে আপনাকে গতিশীল এসকিউএল এবং পিএল / পিজিএসকিউএল ব্যবহার করতে হবে EXECUTE

পিএল / পিজিএসকিউএল পোস্টগ্রেএসকিউএল ৯.০ বা তার পরে পূর্বনির্ধারিত is পোস্টগ্রিস ৮.৩ এ আপনাকে একবার ডাটাবেস ইনস্টল করতে হবে, যদিও:

CREATE LANGUGAGE plpgsql;

সংস্করণটির কথা বলছি: আপনার পোস্টগ্র্রেএসকিউএল এর বর্তমান সংস্করণে আপগ্রেড করার বিষয়টি বিবেচনা করা উচিত । v8.3 এখনই খুব পুরানো, 2013 সালের শুরুর দিকে জীবনের শেষ মুহূর্তে।

যেহেতু আপনার কাছে প্রস্তুত এসকিউএল স্ক্রিপ্ট রয়েছে বলে মনে হচ্ছে আমি একটি এসকিউএল ফাংশন প্রদর্শন করব। দুটি পূর্ণসংখ্যার যুক্তি সহ সহজ ডামি ফাংশন:

CREATE OR REPLACE FUNCTION func(int, int)
    LANGUAGE sql RETURNS void AS 
$func$
    UPDATE tbl1 SET col1 = $1 WHERE id = $2;
    UPDATE tbl2 SET col1 = $1 WHERE id = $2;
$func$;

আপনি plpgsql এর জন্য আরও অনেক পরিশীলিত উদাহরণ খুঁজে পেতে পারেন এখানে ডিবিএএসই বা এসও তে

আপনি এই ফাংশনটি কল করতে পারেন এবং শেল স্ক্রিপ্টে প্যারামিটারগুলিতে হাত দিতে পারেন: শেল স্ক্রিপ্টে কল করার জন্য বেসিক উদাহরণ যা পূর্ণসংখ্যার পরামিতিগুলির জন্য ইনপুট পরামিতি ব্যবহার করে (প্রয়োজনীয় মানের কাছাকাছি কোনও একক-কোট নেই):

psql mydb -c "SELECT func($1, $2)"

অথবা যে কোনও ডাটা টাইপের সাথে:

psql mydb -c "SELECT func2('$1'::text, '$2'::numeric)"

-cexecutes এক কমান্ড স্ট্রিং এবং তারপর প্রস্থান করে। ম্যানুয়ালটিতে পিএসকিএল-এর কমান্ড লাইন আর্গুমেন্ট সম্পর্কে আরও ।


প্রতিক্রিয়াটির জন্য ধন্যবাদ - আমি plpgsql সম্পর্কে আসলে বেশ সচেতন - এই স্ক্রিপ্টটি আমি উল্লেখ করছি এমন একটি ফাইল যা অসংখ্য ফাংশন ধারণ করে। সি-ওরিয়েন্টেড প্রোগ্রামিংয়ের অর্থে আমার একটি "প্রধান" ফাংশন রয়েছে। স্ক্রিপ্ট / ফাইলের মধ্যে শেষ 2 লাইনগুলি হ'ল 1) "মূল" ফাংশনটি কল করে এবং তারপর 2) ফাংশনটি বাদ দেয়। সুতরাং, এই সেটআপে, আমার কাছে মূলত একটি স্ব-অন্তর্ভুক্ত স্ক্রিপ্ট রয়েছে যা কাজ করার জন্য চালানো যেতে পারে (পিএসকিএল-ফ)) আমি পিএসকিএল-সি এর মাধ্যমে "অ্যাপ্লিকেশন আরগস" দিয়ে কোনও ফাংশন কল করার বিষয়ে আপনার বক্তব্যটি পছন্দ করি। আমি সম্ভবত route রুটটিতে যাব, কারণ আমি পোস্টগ্রেস.কনফ ফাইলটিতে মান যুক্ত করার রুটটি যেতে পারি না।
Jmoney38

5

এর জন্য অন্য কার্যকারিতা যুক্ত করতে -v... আপনি যদি উদ্ধৃতি যোগ করার চেষ্টা করছেন, কমান্ড লাইনে এটি যুক্ত করুন:

psql -v action="'drop'"

এবং এটি এর জন্য কোডটি চালাবে:

select * where :action;

হিসাবে একই

select * where 'drop';

4

চেষ্টা করুন -v:

$ psql -U postgres -v something=\'blah-blah\'
psql (9.1.3)
Type "help" for help.

postgres=# select :something;
 ?column?
----------
 blah-blah
(1 row)

আপনি যদি ব্যবহার করতে চান current_settingএবং SETবা setval, postgresql.confবিকল্পটি যুক্ত করতে আপনাকে একটি সারি যুক্ত করতে হবে।


2

আমার অভিজ্ঞতা থেকে, একটি পিএলপিএলএসকিএল ঘোষণার মধ্যে যেমন একটি পিএসকিএল ভেরিয়েবল ডেরিফ করা যেমন ক্রিয়েট ফাংশন শুরু করা বা ডিও বিগিন ফলাফল একটি বাক্য গঠন ত্রুটির ফলে:

/tmp $ psql -U jmindek -v action=drop
psql (9.3.4)
Type "help" for help.

jmindek=# select :'action';
 ?column? 
----------
 drop
(1 row)

jmindek=# DO $$ BEGIN RAISE INFO 'The value in variable action is (%)',:x; END $$;     
ERROR:  syntax error at or near ":"
LINE 1: ... RAISE INFO 'The value in variable action is (%)',:x; END $$...

আমার সমাধানটি হ'ল একটি একক কলাম সহ অস্থায়ী টেবিল তৈরি করা এবং এর মধ্যে মানটি সংরক্ষণ করা। এই অস্থায়ী টেবিলটি plpgsql এর মাধ্যমে অ্যাক্সেসযোগ্য এবং এইভাবে আমি ডিও ব্লকগুলিতে ব্যবহৃত পিএসএকিএল ভেরিয়েবলগুলি পাস করতে পারি।

 ~ $ psql -v action=drop
psql (9.3.4)
Type "help" for help.

jmindek=# create temporary table actions (type text);                                                             CREATE TABLE
jmindek=# insert into actions values (:'action');                                                                 INSERT 0 1
jmindek=# do $$                                                                                                   declare                                                                                                            action_type text := null;                                                                                        begin                                                                                                               select type from actions into action_type;                                                                        raise info 'Hello, the action is (%)',action_type;                                                              end $$;
INFO:  Hello, the action is (drop)
DO
jmindek=#

ক্রিয়েট ফাংশন বা ডিও ঘোষণাগুলিতে অতিরিক্ত পিএসকিএল ভেরিয়েবলগুলি ব্যবহার করতে আপনি প্রয়োজনীয় প্রতি পরিবর্তনশীল কলাম তৈরি করতে পারেন।


0

এটি খুব মার্জিত নয় তবে এটি কাজ করে (সিউডোকোড):

cat <<EOF
   UPDATE tablename SET field=$arg1 WHERE field = $arg2;
EOF | psql database

0

এই পদ্ধতির আপনাকে এনভ ভার্সের পুরো রান-টাইম রেজোলিউশন সরবরাহ করবে ... সুতরাং আপনার স্ক্রিপ্টটি সমস্ত শেল ভেরিয়েবলগুলি কাজ করবে বলে এটি আগে হাতে রাখার আগেই ( বিভিন্ন ডিবিএস এবং হোস্টের বিরুদ্ধে হাজার হাজারবার চালানো হয়েছে ):

    -- start run.sh

       # 01 create / modify the app user
       sql_script="$pgsql_scripts_dir/01.create-qto-app-user.pgsql"
       PGPASSWORD="${postgres_db_useradmin_pw:-}" psql -q -t -X -w -U "${postgres_db_useradmin:-}" \
          -h $postgres_db_host -p $postgres_db_port \
          -v ON_ERROR_STOP=1 \
          -v postgres_db_user_pw="${postgres_db_user_pw:-}" \
          -v postgres_db_name="${postgres_db_name:-}" \
          -f "$sql_script" "${postgres_db_name:-}" > "$tmp_log_file" 2>&1
       ret=$?
       cat "$tmp_log_file" ; cat "$tmp_log_file" >> $log_file # show it and save it
       test $ret -ne 0 && sleep 3
       test $ret -ne 0 && doExit 1 "pid: $$ psql ret $ret - failed to run sql_script: $sql_script !!!"
    -- stop run.sh

    -- start fun.sql
            DO
            $do$
            BEGIN
               IF NOT EXISTS (
                  SELECT
                  FROM   pg_catalog.pg_roles
                  WHERE  rolname = 'usrqtoapp') THEN
                     CREATE ROLE usrqtoapp WITH PASSWORD ':postgres_db_user_pw' LOGIN ;
               END IF;
            END
            $do$;
            ALTER ROLE usrqtoapp WITH PASSWORD  :'postgres_db_user_pw' LOGIN ;

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