как изменить v$session.program

Вам хотелось когда-нибудь изменить значение поля program из v$session для уже работающей сессии? Мне нет, но я пару раз встречал таких желающих.

Сам я предполагаю, что эта задача неосуществима средствами pl/sql и вообще OCI-интерфейса.

Однако для "обезбашенных" любителей ковыряться непонятно где, в данной заметке предлагается-таки способ изменения v$session.program

Для начала, вероятно, надо почитать заметку на этом сайте под названием прямой доступ к SGA.

Когда станет понятно, о чем там идет речь, то далее можно самостоятельно проделать следующее (вариант для C extension module для python):

Затем можно запустить примерно такой python скрипт, который будет менять значение program для всех пользователей 'SCOTT' на 'some program':

#!/usr/bin/env python

import readSGA

# you have to calculate these values by yourself
shmid = 1
sgaBase = 0x50000000
ksuseAddr = 0x5F8A004C
rowSize = 4584
rowCount = 170

rc = readSGA.attach(shmid,sgaBase)
if (rc == -1):
  sys.exit("can't attach to SGA with id %d" % shmid)

memaddr = ksuseAddr
for i in range(rowCount-1):
  ksspaflg = readSGA.read1(memaddr+1)
  ksuseflg = readSGA.read4(memaddr+3292)
  username = readSGA.reads(memaddr+71,30) # ksuudlna
  if (ksspaflg & 1 != 0) and (ksuseflg & 1 != 0):
    if username == 'SCOTT':
      readSGA.writes(memaddr+3620,'some program',48) # ksusepnm
  memaddr += rowSize

После выполнения этого скрипта можно будет удостовериться (select username, program from v$session where username='SCOTT';), что значение program стало именно таким, каким мы захотели.

Напоследок хочется, как всегда, заметить, что такого рода эксперименты стоит проделывать только на базах, которые вы готовы потерять в любой момент.