You're not going mad ( well almost, but not quite ). It's something to do with FAST DUAL, as mentioned on my previous post. If we use a pipelined function as a single row source instead, it works:-

Code:
SQL> SELECT package_name.get_a,
  2         package_name.get_b
  3  FROM  ( SELECT (CASE
  4                   WHEN 1 = 1 THEN
  5                     package_name.set_a_b (1, 2)
  6                   END)
  7           FROM   TABLE( one_row )
  8           ORDER BY 1);

     GET_A      GET_B
---------- ----------
         1          2
Wonder what optimisation FAST DUAL has that makes it behave like this?

Regards
Adrian