必要条件は、STUDENTSテーブルから結果をフェッチすることです。 生徒IDとしてゼロが渡された場合、studentidのフィルタリングはこれ以上必要ありません。ORACLEの動的where句
inStudentIdをTO_CHARを使用して文字列に変換し、次いでを好きに供されるように確かに理想的ではない -
PROCEDURE getResults (
inStudentId IN NUMBER,
inSectionId IN NUMBER,
inRowLimit IN NUMBER,
outResultsData OUT gphResultsData
) AS
stStudentId VARCHAR2(50) := '';
BEGIN
outResultsData := gphResultsData();
IF inStudentId = '0' THEN
stStudentId := '%';
ELSE
stStudentId := TO_CHAR(inStudentId);
END IF;
FOR rResults IN (
SELECT
RESULTS.STUDENT_ID,
RESULTS.STUDENT_NAME
FROM
RESULTS
WHERE
RESULTS.STUDENT_ID LIKE stStudentId AND -- not a good idea
RESULTS.SECTION_ID = inSectionId AND
ROWNUM <= inRowLimit
) LOOP
outResultsData.extend;
outResultsData(outResultsData.last).studentId := rResults.STUDENT_ID;
outResultsData(outResultsData.last).studentName := rResults.STUDENT_NAME;
END LOOP;
EXCEPTION
WHEN others THEN
...
Iは、上記溶液が出ています。
は、where句を動的に生成して実行するのが良い方法だと思います。
inStudentIdが
SELECT
RESULTS.STUDENT_ID,
RESULTS.STUDENT_NAME
FROM
RESULTS
WHERE
RESULTS.STUDENT_ID = inStudentId AND
RESULTS.SECTION_ID = inSectionId AND
ROWNUM <= inRowLimit
、ゼロでない場合は最高のこの問題を解決する方法上の任意のポインタは素晴らしいものだinStudentId = 0、
SELECT
RESULTS.STUDENT_ID,
RESULTS.STUDENT_NAME
FROM
RESULTS
WHERE
RESULTS.SECTION_ID = inSectionId AND
ROWNUM <= inRowLimit
場合 - である助けて。
もし望むなら、条件を 'WHERE'節に置くことができます:' RESULTS.SECTION_ID = DECODE(inSecti onId、0、RESULTS.SECTION_ID、inSectionId) ' – Glenn
完全な論理条件を書き出すことが複雑にならないようにするには、DECODEを避けるのが最善です。コードは「自分のために話す」ということは、CarloCeのソリューションのように、維持したり変更したりする方が簡単です。 – mathguy
@OriginalPoster:PL/SQLでこれを行う必要がありますか?これは普通のSQLの仕事のようです。または、追加の処理があり、問題が発生した部分を示しただけですか? – mathguy