有没有办法只传递一次变量立即执行但多次使用它?

Dzy*_*ann 2 oracle plsql

我有一个 Cursor 从脚本中获取数据:

OPEN myCursor FOR
SELECT value1 AS Value1,
  myPackage.function1 (value1, :myId) AS Result1,
  myPackage.function2 (value1, :myId) AS Result2,
  myPackage.function3 (value1, :myId) AS Result3                       
FROM mySchema.myTable
WHERE tpk = :myPk
USING myId, myId, myID
Run Code Online (Sandbox Code Playgroud)

如您所见,我使用了myId变量 3 次,并且必须在 using 语句中将其传递 3 次才能使其工作。我在任何地方都找不到它,但是有没有办法只传递myId变量一次?

ype*_*eᵀᴹ 6

我不知道有什么内置方法可以实现这一点,但如果您的目标是只传递一次参数,您可以使用派生表或公用表表达式(CTE 或 Oracle 喜欢称它们为:subquery_factoring_clause)的USING

-- derived table
OPEN myCursor FOR
    SELECT value1 AS Value1,
      myPackage.function1 (value1, my.id) AS Result1,
      myPackage.function2 (value1, my.id) AS Result2,
      myPackage.function3 (value1, my.id) AS Result3                       
    FROM (SELECT :myId AS id, :myPk AS pk FROM dual) my 
      CROSS JOIN 
        mySchema.myTable
    WHERE tpk = my.pk
USING myPk, myId

-- CTE
OPEN myCursor FOR
    WITH my AS
        (SELECT :myId AS id, :myPk AS pk FROM dual)
    SELECT value1 AS Value1,
      myPackage.function1 (value1, my.id) AS Result1,
      myPackage.function2 (value1, my.id) AS Result2,
      myPackage.function3 (value1, my.id) AS Result3                       
    FROM my 
      CROSS JOIN
        mySchema.myTable
    WHERE tpk = my.pk
USING myPk, myId
Run Code Online (Sandbox Code Playgroud)