2

ユーザー入力に基づいて可変数の行をテーブルに挿入できるようにしたいですか?例えば。

Please enter value, enter "done" when no more values: value 1
Please enter value, enter "done" when no more values: value 2
Please enter value, enter "done" when no more values: done

2 Rows inserted successfully.

行を一時的に保存する方法がわかりません。また、ユーザーにデータを挿入するように複数回要求する方法もわかりません。pl / sqlには配列がありますか?

ありがとう

4

5 に答える 5

9

他の人が言っているように、PL / SQLだけではこのタスクには適していません。エンド・ユーザーと対話するには、上部にUIが必要です。ただし、SQL Plusでこれを行う必要がある場合は、このSOの質問で説明した手法を使用することができます。

2つのSQLPlusスクリプトを作成する必要があります。

1)ここではscript_insert.sqlと呼ばれる単一の挿入を実行するスクリプト:

insert into t1 values ('&1.');
@main

2)プロセスを制御するスクリプト。ここではmain.sqlと呼ばれます。

accept selection prompt "Please enter value, enter 'done' when no more values: "

set term off verify off

column script new_value v_script

select case '&selection.'
       when 'done' then ''
       else '@script_insert &selection.'
       end as script
from dual;

set term on

@&v_script.

SQL Plusでは、次のように実行できます。

SQL> select * from t1;

no rows selected

SQL> @main
Please enter value, enter 'done' when no more values: 1
Please enter value, enter 'done' when no more values: 2
Please enter value, enter 'done' when no more values: 3
Please enter value, enter 'done' when no more values: done
SQL> select * from t1;

        N1
----------
         1
         2
         3

これはそれが可能であることを示していることを繰り返し述べておきますが、DBAまたは開発者が使用するアドホックツールでない限り、要件を実装するための良い方法であるとは言いません。エンドユーザーにSQLPlusをUIとして提供することは決してありません。

于 2009-12-09T10:36:38.653 に答える
3

ドライバーで釘を打っていると思います。

Pythonスクリプト、PHPページ、Perlスクリプト、Javaプログラム、またはOracleにアクセスできるその他の環境を使用すると、はるかに柔軟性が高まります。

于 2009-12-09T00:33:34.517 に答える
1

ほとんどの場合、少なくとも、ある種のクライアントアプリケーション(SQL*Plusスクリプトではない)を作成せずに作成することはできません。 PL/SQLサーバー上で実行され、ユーザー入力を受け入れるものは何もありません。 SQL*Plusクライアント上で実行されますが、ループ構造はありません。この2つを混在させることはできないため、PL / SQLループが繰り返し発生して、ユーザーに入力を求め、渡された値に基づいてINSERTを実行することはできません。

最も一般的には、入力を収集して適切なINSERTステートメントを発行する小さなフロントエンドスクリプトをお気に入りのスクリプト言語で作成することで、これを回避できます。

あなたが本当に、本当にタスクを達成したいのであればSQL*Plus、それはおそらく可能ですが、かなり苦痛です。基本的に、エスケープするためにエラーをスローした無限ループを構築する必要があります。例えば

スクリプトa.sqlを定義します(たまたまc:\ tempに保存しています)

whenever sqlerror exit;
accept x_val number prompt "Enter a value for x or -1 to stop  ";
INSERT INTO x( col1 ) values( :x_val );
BEGIN
    IF( &x_val = -1 )
    THEN
      commit;
      RAISE_APPLICATION_ERROR( -20001, 'Done' );
    END IF;
END;
/

@c:\temp\a.sql

そして、SQL*Plus

SQL> variable x_val number;
SQL> crate table x( col1 number );
SQL> truncate table x;

Table truncated.

SQL> @c:\temp\a.sql
Enter a value for x or -1 to stop  3

1 row created.

old   2:        IF( &x_val = -1 )
new   2:        IF(          3 = -1 )

PL/SQL procedure successfully completed.

Enter a value for x or -1 to stop  4

1 row created.

old   2:        IF( &x_val = -1 )
new   2:        IF(          4 = -1 )

PL/SQL procedure successfully completed.

Enter a value for x or -1 to stop  5

1 row created.

old   2:        IF( &x_val = -1 )
new   2:        IF(          5 = -1 )

PL/SQL procedure successfully completed.

Enter a value for x or -1 to stop  -1

1 row created.

old   2:        IF( &x_val = -1 )
new   2:        IF(         -1 = -1 )
BEGIN
*
ERROR at line 1:
ORA-20001: Done
ORA-06512: at line 4

もちろん、ひどく醜いですが、「作品」の定義としては「うまくいく」

于 2009-12-09T00:36:27.817 に答える
1

たぶん、ユーザーに値のコンマ区切りのリストを入力させることができますか?

値を入力してください:1、2、3、4、5

次に、plsqlブロックの文字列を処理します。

于 2009-12-09T06:34:42.337 に答える
1

OracleApplicationExpressをお勧めします。無料で、簡単なアプリをすばやく簡単に作成できます。

確かに、ここでの非常に単純な要件にはやり過ぎかもしれませんが、誰かが戻ってきて「SQL *Plusスクリプトが大好きです。さらにいくつかの機能を追加していただけませんか」と言う可能性があります。小屋の基礎を備えた超高層ビルを再構築します。

于 2009-12-11T07:06:25.627 に答える