0

テーブルに競合マトリックスが格納されています。値テーブル [course1] [course2] を見つけようとしていますが、SQL は協力を拒否します。

これはまったく機能しません。無効な列インデックスと表示されますが、理由はわかりません。

CREATE OR REPLACE PROCEDURE procedure1(course1    IN  VARCHAR2,
                                       course2    IN  VARCHAR2,
                                       conflicted OUT VARCHAR2) AS
  BEGIN

    EXECUTE IMMEDIATE 'SELECT :col1 FROM conflict_matrix_male WHERE course = :col2'
    INTO conflicted
    USING course1, course2;

    dbms_output.put_line(conflicted);
  END procedure1;

だから私は代わりにこれをやってみました:

CREATE OR REPLACE PROCEDURE procedure1(course1 IN VARCHAR2,
                                       course2 IN VARCHAR2) AS
  conflicted1 VARCHAR2(200);
  BEGIN

    EXECUTE IMMEDIATE 'SELECT :col1 FROM conflict_matrix_male WHERE course = :col2'
    INTO conflicted1
    USING course1, course2;

    dbms_output.put_line(conflicted1);
  END procedure1;

これはコンパイルして実行しますが、その列の値ではなく、course1 に渡したものを返します。変数の内容をクエリに動的に置き換えるわけではありません。

私の最後の試みはこれでした:

CREATE OR REPLACE PROCEDURE checkconflict(course1    IN  VARCHAR2,
                                          course2    IN  VARCHAR2,
                                          conflicted OUT VARCHAR2) AS
  query_str VARCHAR2(1000);
  BEGIN

    query_str := 'SELECT ' || course2 ||
                 ' FROM conflict_matrix_male WHERE course = ''' || course1 || ''';';

    dbms_output.put_line(query_str);

    EXECUTE IMMEDIATE query_str INTO conflicted;

    dbms_output.put_line(conflicted);

  END checkconflict;

最初に印刷されたSQLクエリを実行したところ、dbms_output完全に機能しました。しかし、手順は機能していません。エラーは単純なものだと思いますが、それが何であるかわかりません。

編集:

格納されるのは、隣接行列のようなものです。列名は、1列目以外のコース名です。最初の列はコースという名前です。なんだかこんな感じです。

     コース CCES1234 CEEN1235 GEEN8234 コンフリクト
     CCES1234 1 1 0 2
     CEEN1235 0 1 0 1
     GEEN8234 1 1 1 3

しかし、はるかに大きい。私の目標は、2 つのコースの名前を取り、値を返すことができるようにすることです。

例えば:

  • checkConflict('CCES1234', 'CEEN1235')0 を返す必要があります
  • checkConflict('Geen8234', 'CCES1234')1 を返す必要があります。
4

3 に答える 3

1

最後の例では、 and を逆course2にしcourse1たので、それだと思います

query_str := 'select '|| COURSE2 ||' from Conflict_matrix_male where course  = ''' || Course1 || ''';';

する必要があります

query_str := 'select '|| COURSE1 ||' from Conflict_matrix_male where course  = ''' || Course2 || ''';';

ただし、列名だけでなく、バ​​インディングを使用することもできます。

execute immediate 'Select '||course1||' from conflict_matrix_male where course = :col2'  
  into conflicted using course2;
于 2013-11-11T12:28:09.577 に答える