テーブルに競合マトリックスが格納されています。値テーブル [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 を返す必要があります。