Is there a way to pass to execute immediate only once a variable but use it several times? I have a Cursor that gets its data from a script along these lines:

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


As you can see I use the myId variable 3 times and I have to pass it 3 times in the using statement for it to work.
I couldn't find it anywhere, but is there a way I could pass the myId variable only once?
I don't know of any built-in way to accomplish this but you could use a derived table or a Common Table Expression (CTE or as Oracle likes to call them: subquery_factoring_clause), if your aim is to pass the parameters only once in the 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