Re: Keeping stored procedures in the shared pool ?
From: Chris Selwyn <chris_at_perihelion.co.uk>
Date: 1996/01/05
Message-ID: <4cj14d$6to_at_morse.ukonline.co.uk>
shift;
}
}
}
}
}
Date: 1996/01/05
Message-ID: <4cj14d$6to_at_morse.ukonline.co.uk>
Dave Marcus (dmarcus_at_notes.cc.bellcore.com) wrote:
: Try this: grant execute on the package to sys, logon as sys and at the : command line: : begin : dbms_shared_pool.keep ('owner.package_name'); : end : it should work
Here is an oraperl script that I wrote a while ago to keep large stored packages in shared memory :-
It is invoked by
keepem [-d] [-n] <sys password> <minsize>
------------------------Cut here---------------------------#!/usr/local/bin/oraperl
$mode = "keep";
$cmp = ">";
$dummy = 0;
while(( $_ = $ARGV[0]) =~ /^-/ ) {
if( $_ eq "-d" ) { $mode = "unkeep"; $cmp = "<"; } elsif( $_ eq "-n" ) { $dummy = 1; } else { print STDERR "Bad option $_\n"; exit(1); }
shift;
}
$syspwd = $ARGV[0];
$minsize = $ARGV[1];
$syslda = &ora_login($twospec, "sys", $syspwd)
|| &oradie("Failed to create sys session");
$bigobjcsr = &ora_open($syslda, "select owner, name, totsize
from dba_keepsizes where totsize $cmp $minsize") || &oradie("Failed to open cursor on large objects");
$keepcsr = &ora_open($syslda, "begin dbms_shared_pool.$mode(:1); end;")
|| &oradie("Failed to open cursor on large object keeper");
$keptcsr = &ora_open($syslda, "select kept
from v\$db_object_cache where owner = :1 and name = :2 and type in ('PACKAGE', 'PROCEDURE','FUNCTION','PACKAGE BODY')" ) || &oradie("Failed to open cursor on object cache");
$accessiblecsr = &ora_open($syslda, "select count(*)
from all_tab_privs where table_schema = :1 and table_name = :2" ) || &oradie("Failed to open cursor on accessability"); while( ($owner, $name, $totsize) = &ora_fetch($bigobjcsr) ) { print STDERR "Inspecting $owner.$name (size $totsize) - "; &ora_bind($keptcsr, $owner, $name) || &oradie("Failed to bind to kept cursor"); if( ($kept) = &ora_fetch($keptcsr) ) { if( $kept eq "YES" ) { print STDERR "Already kept\n"; } } if( $kept ne "YES" ) { if( $owner ne "SYS" ) { &ora_bind($accessiblecsr, $owner, $name ) || &oradie("Failed to bind to accesibility cursor"); ($accessible) = &ora_fetch($accessiblecsr); } else { $accessible = 1; } if( !$accessible ) { if( !$ldas{$owner} ) { print STDERR "Connecting - "; $ldas{$owner} = &connectasuser($owner); } print STDERR "Granting - "; &ora_do($ldas{$owner}, "grant execute on $name to sys") || &oradie("Failed to grant execute access to sys"); } print STDERR "Keeping - "; if( !$dummy ) { if( &ora_bind($keepcsr, $owner.".".$name) ) { print STDERR "OK\n"; } else { print STDERR "Failed to keep $owner.$name - $ora_errstr\n"; } } else { print "Suppressed\n"; } if( !$accessible ) { # i.e. did a grant print STDERR "Revoking"; &ora_do($ldas{$owner}, "revoke execute on $name from sys") || &oradie("Failed to revoke execute access from sys"); } print STDERR "\n"; }
}
&oradie("Failed to fetch big object") if ( $ora_errno ); &ora_close($keepcsr); &ora_close($keptcsr); &ora_close($bigobjcsr); &ora_close($accessiblecsr); foreach $lda ( values(%ldas) ) { &ora_logoff($lda);
}
&ora_logoff($syslda);
exit(0);
sub connectasuser {
local($uname) = _at__; local($pwd); local($usrlda); $dbausrcsr = &ora_open($syslda, "select password from dba_users where username = :1") || &oradie('Failed to open dba user cursor'); &ora_bind($dbausrcsr, $uname); ($pwd) = &ora_fetch($dbausrcsr); &oradie("Failed to find user $uname") if( !$pwd ); &ora_close($dbausrcsr); &ora_do($syslda, "alter user $uname identified by temporary_dummy_password_")|| &oradie("Failed to change password"); $usrlda = &ora_login($twospec, $uname, 'temporary_dummy_password_' ); if( !$usrlda ) { &ora_do($syslda, "alter user $uname identified by values '$pwd'")|| &oradie("Failed to change password back!"); &oradie("Failed to connect as $uname"); } &ora_do($syslda, "alter user $uname identified by values '$pwd'")|| &oradie("Failed to change password back!"); $usrlda;
}
sub oradie {
local($msg,$line) = _at__; local($package, $filename, $line) = caller; print STDERR "Oracle Error - $ora_errstr ($ora_errno) : $msg at line $line of $filename\n"; die "Exiting due to Oracle error";
}
------------------------Cut here---------------------------
-- Chris Selwyn Senior Consultant Perihelion Software email: chris_at_perihelion.co.uk tel: +44 1749 344203Received on Fri Jan 05 1996 - 00:00:00 CET