Ja, mit einem der folgenden:
WHERE m.id_pk = NVL(n_RequiredId, m.id_pk);
WHERE m.id_pk = COALESCE(n_RequiredId, m.id_pk);
WHERE (n_RequiredId IS NULL OR m.id_pk = n_RequiredId);
...sind nicht tragbar. Sie werden funktionieren, aber die schlechteste der verfügbaren Optionen ausführen.
Wenn Sie nur einen Parameter haben, sind IF/ELSE und separate, maßgeschneiderte Anweisungen eine bessere Alternative.
Die nächste Option danach ist dynamisches SQL. Das Codieren von dynamischem SQL ist jedoch nutzlos, wenn Sie die nicht-sargable Prädikate aus dem ersten Beispiel übernehmen. Mit Dynamic SQL können Sie die Abfrage anpassen und gleichzeitig zahlreiche Pfade berücksichtigen. Aber es riskiert auch SQL-Injection, also sollte es hinter parametrisierten Abfragen durchgeführt werden (vorzugsweise innerhalb gespeicherter Prozeduren/Funktionen in Paketen.