Index: openacs-4/packages/acs-kernel/sql/oracle/upgrade/upgrade-5.9.1d18-5.9.1d19.sql
===================================================================
RCS file: /usr/local/cvsroot/openacs-4/packages/acs-kernel/sql/oracle/upgrade/upgrade-5.9.1d18-5.9.1d19.sql,v
diff -u -N
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ openacs-4/packages/acs-kernel/sql/oracle/upgrade/upgrade-5.9.1d18-5.9.1d19.sql	7 Aug 2017 23:47:56 -0000	1.2
@@ -0,0 +1,162 @@
+create or replace package util
+as
+    function multiple_nextval(
+	v_sequence_name in varchar2,
+	v_count in integer)
+        return varchar2;
+
+    function logical_negation (
+        true_or_false IN varchar2)
+	return varchar2;
+    
+    function table_exists (
+	name in varchar2)
+	return boolean;
+	
+    function table_column_exists (
+	t_name  in varchar2,
+	c_name in varchar2)
+	return boolean;
+    
+    function view_exists (
+	name in varchar2)
+	return boolean;
+	
+    function index_exists (
+	name in varchar2)
+	return boolean;
+end util;
+/
+show errors
+
+create or replace package body util
+as
+    -- Retrieves v_count (not necessarily consecutive) nextval values from the
+    -- sequence named v_sequence_name.
+    function multiple_nextval(
+	v_sequence_name in varchar2,
+	v_count in integer
+    )
+    return varchar2
+    is
+	a_sequence_values varchar2(4000);
+    begin
+	execute immediate '
+	    declare
+		a_nextval integer;
+	    begin
+		for counter in 1..:v_count loop
+		    select ' || v_sequence_name || '.nextval into a_nextval from dual;
+		    :a_sequence_values := :a_sequence_values || '','' || a_nextval;
+		end loop;
+	    end;
+	' using in v_count, in out a_sequence_values;
+	return substr(a_sequence_values, 2);
+    end;
+
+    function logical_negation (
+        true_or_false IN varchar2)
+    return varchar2
+    as
+    begin
+      IF true_or_false is null THEN
+        return null;
+      ELSIF true_or_false = 'f' THEN
+        return 't';   
+      ELSE 
+        return 'f';   
+      END IF;
+    END logical_negation;
+    
+    function table_exists (
+        name IN varchar2)
+    return boolean
+    as
+
+      v_count integer;
+      v_exists boolean;
+
+    begin
+
+      select decode(count(*),0,0,1) into v_count 
+      from user_tables where table_name = upper(table_exists.name);
+
+      if v_count = 1 then
+        v_exists := true;
+      else
+        v_exists := false;
+      end if;
+
+      return v_exists;
+
+    END table_exists;
+    
+    function table_column_exists (
+        t_name  IN varchar2,
+        c_name IN varchar2)
+    return boolean
+    as
+      v_count integer;
+      v_exists boolean;
+
+    begin
+
+      select decode(count(*),0,0,1) into v_count from user_tab_columns
+      where table_name = upper(table_column_exists.t_name)
+      and column_name = upper(table_column_exists.c_name);
+
+      if v_count = 1 then
+        v_exists := true;
+      else
+        v_exists := false;
+      end if;
+
+      return v_exists;
+      
+    END table_column_exists;
+    
+    function view_exists (
+        name IN varchar2)
+    return boolean
+    as
+      v_count integer;
+      v_exists boolean;
+
+    begin
+
+      select decode(count(*),0,0,1) into v_count 
+      from user_views where view_name = upper(view_exists.name);
+
+      if v_count = 1 then
+        v_exists := true;
+      else
+        v_exists := false;
+      end if;
+
+      return v_exists;
+
+    END view_exists;
+    
+    function index_exists (
+        name IN varchar2)
+    return boolean
+    as
+      v_count integer;
+      v_exists boolean;
+
+    begin
+      select decode(count(*),0,0,1) into v_count 
+      from user_indexes where index_name = upper(index_exists.name);
+
+      if v_count = 1 then
+        v_exists := true;
+      else
+        v_exists := false;
+      end if;
+
+      return v_exists;
+    END index_exists;
+
+end util;
+/
+show errors
